AsyncTask返回List给Activity

6

如何将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)。
有任何建议怎样做吗?:-)
到目前为止,谢谢!

http://stackoverflow.com/questions/17398837/processdialog-is-not-appearing-properly. 在这种情况下,您需要返回一个字符串。请相应地进行修改。 - Raghunandan
这可能取决于您想如何使用列表。您能否提供更多信息? - Enrichman
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();
    }

}    

异步任务(AsyncTask):

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的问题中。请使用您自己的变量。 - wtsang02

2
如果您将AsyncTask作为Activity的内部类,则onPostExecute将与Activity处于相同的上下文中,您可以像在Activity中的任何地方一样使用List。
如果您不将AsyncTask作为Activity的内部类,则需要设置一个监听器,在AsyncTask完成时回调到Activity。如果您愿意采用这种方式,请查看this post
还有this post与您的问题类似。

4
不叫子类。措辞应该是:“在你的Activity中将AsyncTask实现为一个内部类”。 - wtsang02

2
根据来自Android的文档链接,您可以使用get方法返回计算结果。由于您的AsyncTask显示您正在返回一个List,因此您可以尝试在调用异步类的类中使用以下代码。
List<String> returnedlist=new LoadStringAsync().execute().get();

希望这个选项能够帮助您。

2
这应该是正确的答案。它遵循了正确的指导方针。 - ibrik

0

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

最好从父活动中运行您的任务,例如:

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();
  }
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接