6

如何将 AsyncTask 中生成的列表返回给 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 中使用 List 才能使用它。(不仅在 ListView 中显示它:P)

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

到目前为止感谢!

4

5 回答 5

10

你的活动

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);
    }
}
于 2013-07-11T14:45:27.467 回答
2

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

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

还有这篇文章与您的问题相似。

于 2013-07-11T14:35:47.990 回答
2

根据android链接的文档,您可以使用该get方法返回计算结果。由于您的 AsyncTask 显示您正在返回一个列表,因此您可以在调用异步类的类中尝试以下代码

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

希望这个选项有帮助。

于 2017-08-21T10:00:01.587 回答
0

将使用列表或将其设置为变量的代码放在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();
  }
}
于 2013-07-11T14:34:25.413 回答
0

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

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

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

于 2013-07-11T14:37:29.313 回答