从AsyncTask传递结果?

时间:2013-08-01 15:52:48

标签: android arraylist android-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结合使用,由于某种原因这引发了错误。我尝试创建一个单独的类,只有一个static的ArrayList对象包含这些条目,但这似乎也失败了。如果有必要,我可以提出我的尝试,但是如果有人可以推荐一个很好的方法来存储一个ArrayList,以便所有其他活动都可以轻松访问它,那将是最有帮助的。

1 个答案:

答案 0 :(得分:1)

将其存储在您的应用程序类中。也就是说,扩展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;
  }
}

onPostExecute(),致电,

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

只要您需要来自任何其他组件的应用,请致电

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

当应用列表尚不可用时,您仍需要考虑所执行操作的复杂性。为此,你可以

  1. 创建自己的回调界面...例如,您调用getApps()并传递回调,而不是调用getApps()并获取返回结果。然后getApps()的实现会立即调用回调,或者启动AsyncTask并在onPostExecute()中调用回调。

  2. 如果getApps()不可用,则从AsyncTask返回null,然后启动{{1}}。当任务完成时,广播一个表明应用程序现在可用的意图。感兴趣的呼叫者必须注册意图并妥善处理。