0

我有一个在启动时执行的异步任务:

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,特别是用户在设备上安装的所有应用程序的列表。我想我只是在这里画一个空白,但我已经尝试了一段时间并且无法完全弄清楚:installedApps我传递给 onPostExecute 似乎没问题。所以说这installedApps就是上面描述的列表。

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

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

4

1 回答 1

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()then的实现getApps()要么立即调用回调(如果有),要么启动AsyncTask并在onPostExecute().

  2. getApps()如果它不可用,只需返回 null ,然后启动AsyncTask. 当任务完成时,广播一个指示应用程序现在可用的意图。感兴趣的调用者必须注册意图并适当地处理它。

于 2013-08-01T15:57:42.143 回答