2013-08-01 32 views
0

我有一个是发射时执行的异步任务:向前传递AsyncTask的结果?

public class BufferApps extends AsyncTask<String, Void, ArrayList<PackageInfo>> { 

PackageManager mPackageManager; 
Context mContext; 

public BufferApps(PackageManager pm, Context context){ 
    super(); 
    this.mPackageManager = pm; 
    this.mContext = context; 
} 

    protected ArrayList<PackageInfo> doInBackground(String... strings) { 

     //this code works, not where the problem is 

     return installedApps; 
    } 

    protected void onPostExecute(ArrayList<PackageInfo> installedApps) { 

     ? 

     Toast.makeText(mContext, "Finished!", Toast.LENGTH_SHORT).show(); 
    } 
} 

基本上这里发生了什么是我创建的对象的ArrayList,特别是通过设备上的用户安装的所有应用程序的列表。我想我只是在这里画一个空白,但我一直在尝试这一段时间,不能完全弄明白:我传递给onPostExecute的installedApps似乎没问题。所以说installedApps就是上面描述的列表。

我想要的是将这个列表存储在某个地方,这样当我需要在我的设备上安装的应用程序列表时,我可以快速访问它,而无需执行加载已安装应用程序的所有艰难工作(doInBackground中的代码需要相当长的时间来执行)。我怎样才能做到这一点?

我已经尝试过gson序列化与SharedPreference一起使用,由于某种原因会引发错误。我试图创建一个单独的类只有一个ArrayList对象是static来包含这些条目,但这也似乎失败。如果有必要,我可以提出我的尝试,但是如果任何人都可以推荐一个好方法来存储ArrayList,以便其他所有活动都可以轻松访问它,那将是最有帮助的。

+0

你应该看看不同选项的Android为您提供:http://developer.android.com/guide/topics/data/data-storage.html –

+1

您可以使用。调用AsyncTask的类中的get()方法。如... BufferApps.execute(); arrayList = BufferApps.get(); –

回答

1

将它存储在您的应用程序类中。也就是说,在您的onPostExecute()延长Application,并指定这个类在你的清单,

<application 
     android:name=".MyApplication" 

现在实现你的应用程序类这样的,

public class MyApplication extends Application { 

    private final List<App> apps = new ArrayList<App>(); 

    public void setApps(List<App> apps) { 
    this.apps = apps; 
    } 

    public List<App> getApps() { 
    return apps; 
    } 
} 

,打电话,

((MyApplication)getApplication()).setApps(apps); 

随时随地你需要来自任何其他组件的应用程序,请致电

List<App> apps = ((MyApplication)getApplication()).getApps(); 

您仍然需要考虑应用程序列表尚不可用时所做的复杂性。对于这一点,你可以

  1. 创建自己的回调接口...例如,而不是调用getApps(),并采取返回结果,你叫getApps(),并传递一个回调。 getApps()的实现然后要么立即调用回调,如果它有,或者启动AsyncTask并在onPostExecute()中调用回调。

  2. 只是从getApps()返回空,如果它不可用,并且启动AsyncTask。当任务完成时,广播一个意图,表明应用程序现在可用。有兴趣的来电者必须注册意图并妥善处理。