【问题标题】:Passing result of AsyncTask onwards?向前传递 AsyncTask 的结果?
【发布时间】:2013-08-01 15:52:48
【问题描述】:

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

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 的好方法,以便所有其他活动可以轻松访问它,那将是最有帮助的。

【问题讨论】:

标签: android arraylist android-asynctask


【解决方案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() 不可用,只需从它返回 null,然后启动 AsyncTask。当任务完成时,广播一个指示应用程序现在可用的意图。感兴趣的调用者必须注册意图并适当地处理它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2015-06-12
    相关资源
    最近更新 更多