需要说明:如何使用AsyncTask?

时间:2013-03-19 17:18:41

标签: java android asynchronous android-asynctask

我有一个包含一些数据的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 个答案:

答案 0 :(得分:6)

覆盖AsyncTask的{​​{1}}方法:

onPostExecute

请注意,这假设您的AsyncTask是您的活动的内部类。如果不是这种情况,您可以将构造函数中对Activity的引用传递给AsyncTask。在这些情况下,您应该小心使用protected void onPostExecute(MyData result) { md = result; } 来激活您的活动,以防止资源泄漏:

WeakReference

答案 1 :(得分: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;
    }
}

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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