【问题标题】:AsyncTask return List to ActivityAsyncTask 将 List 返回到 Activity
【发布时间】:2013-07-11 14:32:20
【问题描述】:

如何将 AsyncTask 中生成的 List 返回到 Activity?

我的 LoadStringsAsync 类:

public class LoadStringsAsync extends AsyncTask<Void, Void, List<String> > {

    List<String> str;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        ...
    }

    @Override
    protected List<String> doInBackground(Void... arg0) {
        ...
        get content from the internet
        and
        fill the list
        ...
    }

    @Override
    protected void onPostExecute(List<String> str) {
        super.onPostExecute(events);
        ...

    }
}

并且我需要将列表返回到我的 Activity 中才能使用它。 (不只是在 ListView 中显示它:P)

任何建议如何做到这一点? :-)

到目前为止谢谢!

【问题讨论】:

标签: android android-asynctask android-activity


【解决方案1】:

您的活动

public class YourActivity extends Activity {
    private List<String> list = new ArrayList<String>();

    public void onCreate(Bundle state) {
        //...
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    private void fireYourAsyncTask() {
        new LoadStringsAsync(this).execute();
    }

}    

异步任务

public class LoadStringsAsync extends AsyncTask<Void, Void, List<String>> {

    List<String> str;
    private YourAcitivity activity;

    public LoadStringsAsync(YourAcitivity activity) {
        this.activity = activity;
    }

    @Override
    protected List<String> doInBackground(Void... arg0) {
    }

    @Override
    protected void onPostExecute(List<String> str) {
        super.onPostExecute(events);
        activity.setList(str);
    }
}

【讨论】:

  • 'events' 变量是 op 的问题。使用你自己的变量。
【解决方案2】:

如果您将 AsyncTask 设置为 Activity 中的内部类,则 onPostExecute 将与 Activity 处于相同的上下文中,并且您可以像在 Activity 中的任何位置一样使用 List。

如果您不将 AsyncTask 设为 Activity 中的内部类,则需要设置一个侦听器以在 AsyncTask 完成时回调您的 Activity。如果您更喜欢这条路线,请查看this post

还有this post和你的问题类似。

【讨论】:

  • 它不称为子类。措辞应该是。“将 AsyncTask 实现为 Activity 中的内部类”。
【解决方案3】:

根据android link 的文档,您可以使用get 方法返回计算结果。由于您的 AsyncTask 显示您正在返回一个 List,那么您可以在调用异步类的类中尝试以下代码

List<String> returnedlist=new LoadStringAsync().execute().get();

希望这个选项有帮助。

【讨论】:

  • 这应该是正确的答案。它遵循正确的准则。
【解决方案4】:

onPostExecute() 中放置使用列表或将其设置为变量的代码。

最好从父 Activity 运行您的任务,例如:

public class MyActivity extends Activity{
  private List<String> mData = new ArrayList<String>();


  private void runTask(){
    new LoadStringsAsync(){

      @Override
      protected void onPostExecute(List<String> str) {
        super.onPostExecute(events);
        mData.clear();
        mData.addAll(str);
      }

    }.execute();
  }
}

【讨论】:

    【解决方案5】:

    您可以将列表发送到 Message 内的处理程序:

    Message msg = Message.obtain();
    msg.obj = myList;
    handler.sendMessage(msg);
    

    更多信息:http://developer.android.com/reference/android/os/Message.html

    【讨论】:

      猜你喜欢
      • 2015-10-21
      • 1970-01-01
      • 2017-12-16
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 2018-05-07
      • 1970-01-01
      相关资源
      最近更新 更多