【问题标题】:AsyncTask : what am I misunderstanding?AsyncTask:我误解了什么?
【发布时间】:2013-03-19 20:02:02
【问题描述】:

我的activity 包含一个内部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);

但不起作用,为什么?我究竟做错了什么? 感谢您的帮助。

【问题讨论】:

  • 据我所知,由于new GetXMLTask(this),它甚至不应该编译。但从根本上说,我认为你错过了异步的含义。
  • 这个编译好了,但是我没有写构造函数,因为我只是想展示主要的东西。我会添加它以避免这种情况,谢谢。

标签: java android asynchronous android-asynctask


【解决方案1】:

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

【讨论】:

  • 不要使用您希望由主线程中的 AsyncTask 填充的变量。相反,在任务完成后处理结果,可以在 doInBackground 函数中或(如果您需要更改 UI)AsyncTask 的 onPostExecute 函数中。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-28
        • 2011-01-11
        • 2015-03-18
        • 2014-08-06
        • 1970-01-01
        • 2017-12-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多