需要说明:如何使用AsyncTask?

Rob*_*Rob 2 java android asynchronous android-asynctask

我有一个包含一些数据的XML文件,所以我创建了一个代表它的类:

public class MyData
{
    ArrayList<SpecialData> list;
    int currentPage, totalPages;
}
Run Code Online (Sandbox Code Playgroud)

您可以猜测我有一个SpecialData项目列表,每个项目包含许多字段,并且currentPage/ totalPages是XML文件中的两个唯一值.我需要异步地获取和解析XML文件,所以我创建了这个类:

class GetXMLTask extends AsyncTask<String, Void, MyData>
{
    @Override
    protected MyData doInBackground(String... params)
    {
        MyData md = null;
        // Getting/parsing data
        return md;
    }
}
Run Code Online (Sandbox Code Playgroud)

我试了一下,问题不是来自这里,因为我正确地解析了我的XML文件,我的MyData对象是完美的.但后来我在我的主Activity类中使用这个任务:

MyData md = null;
GetXMLTask task = new GetXMLTask(this);
task.execute(new String[]{url});
// How can this change my md object?
Run Code Online (Sandbox Code Playgroud)

这可能非常愚蠢,但我根本不知道如何将我的MyData实例从我的主类链接到我得到的实例AsyncTask.我该怎么办?谢谢.

ian*_*ake 6

覆盖AsyncTaskonPostExecute方法:

protected void onPostExecute(MyData result) {
     md = result;
 }
Run Code Online (Sandbox Code Playgroud)

请注意,这假设您的AsyncTask是您的活动的内部类.如果不是这种情况,您可以将构造函数中对Activity的引用传递给AsyncTask.在这些情况下,您应该小心使用WeakReference您的Activity来防止资源泄漏:

GetXMLTask(MyActivity activity)
{
    this.mActivity = new WeakReference<MyActivity>(activity);
}

protected void onPostExecute(MyData result)
{
     MyActivity activity = this.mActivity.get();
     if (activity == null) // Activity was destroyed due to orientation change, etc.
         return;
     activity.updateUiFromXml(result);
 }
Run Code Online (Sandbox Code Playgroud)