我有一个在启动时执行的异步任务:
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,以便所有其他活动都可以轻松访问它,那将是最有帮助的。
答案 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();
当应用列表尚不可用时,您仍需要考虑所执行操作的复杂性。为此,你可以
创建自己的回调界面...例如,您调用getApps()
并传递回调,而不是调用getApps()
并获取返回结果。然后getApps()
的实现会立即调用回调,或者启动AsyncTask
并在onPostExecute()
中调用回调。
如果getApps()
不可用,则从AsyncTask
返回null,然后启动{{1}}。当任务完成时,广播一个表明应用程序现在可用的意图。感兴趣的呼叫者必须注册意图并妥善处理。