1

Myactivity包含一个 inner private class,这基本上就是它的样子,但有问题:

public class MyActivity extends Activity
{
    // My xmlData that I want to fill in the asynchronous task
    XMLData xmlData;

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

        GetXMLTask task = new GetXMLTask(this);
        task.execute(url);

        if(xmlData == null) System.out.print("problem");
        // Prints "problem" : my xmlData is null, why?
    }

    private class GetXMLTask extends AsyncTask<String, Void, Void>
    {
        public GetXMLTask(Activity context)
        {
            // Constructor
        }

        protected Void doInBackground(String... params)
        {
            // Here some stuff to get and parse my XML
            xmlData = new XMLData(list);
            System.out.print(xmlData.list.size());
            // this line shows that I correctly fill my xmlData object
        }
    }
}

问题是在调用内部异步类之后,我的 xmlData 值为 null,我不知道为什么。我也在我的GetXMLTask

MyActivity.this.xmlData = new XMLData(list);

还是不行,为什么呢?我究竟做错了什么?谢谢你的帮助。

4

4 回答 4

8

异步任务发生在不同的线程上。原始线程立即继续。所以 xmlData 变量直到未来某个未知时间才会更新,它不会立即准备好。

于 2013-03-19T20:04:36.480 回答
4

正如 Gabe 在他的回答中指出的那样,在任务完成之前它不会可用。出于这个原因,你有onPostExeccute(). 您将检索doInBackground()到的数据从onPostExecute()您对数据执行所需操作的位置传递或将其发送到主函数中的函数Activity

于 2013-03-19T20:09:57.223 回答
2

返回 doInBackGround 中的值并将其捕获 onPostExecute 以便在不阻塞 UI 线程的情况下顺利执行,还有另一种方法可以在 Asycn 任务对象上调用 get() 方法,但这会阻塞您的 UI

于 2013-03-19T20:10:41.487 回答
1

如果创建 XML 数据需要相当长的时间,您可以先创建一个空的 XMLData 对象,将其填充到 AsyncTask 的背景部分,然后在 on Finish 方法中继续您的操作。这样加载将在后台线程中进行,但您可以在 UI 线程上执行加载后操作。

于 2013-03-19T20:13:12.120 回答