2

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

public class MyData
{
    ArrayList<SpecialData> list;
    int currentPage, totalPages;
}

您可以猜到我有一个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;
    }
}

我试了一下,问题不是来自这里,因为我正确解析了我的 XML 文件并且我的MyData对象是完美的。但是后来我在我的主课中使用了这样的任务Activity

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

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

4

4 回答 4

6

覆盖AsyncTaskonPostExecute方法:

protected void onPostExecute(MyData result) {
     md = result;
 }

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

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);
 }
于 2013-03-19T17:22:56.440 回答
2

您可能想要实现某种回调。通过这种方式,您可以通过公开访问来避免暴露您的数据,并且您可以实现其他回调(例如,如果加载数据时出现错误回调)。

例如,您可以定义这样的接口:

interface MyAsyncFinishedLister {
    void onFinished(MyData resultData);
}

你的 AsyncTask 将有一个 MyAsyncFinishedListener 的实例,你可以这样调用 onPostExecute:

protected void onPostExecute(MyData result) {
     myAsyncFinishedListener.onFinished(result);
}

你的主要活动将实现这个接口,看起来像:

class MyActivity extends Activity implements MyAsyncFinishedListener {
    MyData md;

    public void onCreate() {
        super.onCreate();

        GetXMLTask task = new GetXMLTask(this);
        task.execute(new String[]{url});
        task.setOnFinishedListener(this);
    }

    onFinished(MyData result) {
        md = result;
    }
}
于 2013-03-19T17:27:29.570 回答
1

如果希望 AsyncTask 返回数据对象,则需要将其存储在类范围内的变量中,而不是函数范围内。为了简单起见,任务通常是一个私有内部类。

于 2013-03-19T17:21:57.857 回答
1

声明MyData对整个类可见的变量,并尝试onPostExecute()通过将结果分配给 MyData 变量来访问它。

于 2013-03-19T17:23:35.677 回答