我的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);
虽然不起作用,为什么?我究竟做错了什么? 谢谢你的帮助。
答案 0 :(得分:8)
异步任务发生在另一个线程上。原始线程立即继续。因此,xmlData变量在将来某个未知时间之前不会更新,它不会立即就绪。
答案 1 :(得分:4)
正如Gabe在他的回答中指出的那样,在任务完成之前它将无法使用。出于这个原因,你有onPostExeccute()
。您将检索到的数据从doInBackground()
传递到onPostExecute()
,您可以使用数据执行所需操作,或将其发送到主Activity
答案 2 :(得分:2)
返回doInBackGround中的值并捕获onPostExecute以便顺利执行而不阻塞UI线程,还有另一种方法可以在Asycn任务对象上调用get()方法,但这会阻止你的UI
答案 3 :(得分:1)
如果创建XML数据需要相当长的时间,您可以先创建一个空的XMLData对象,将其填入AsyncTask的后台部分,然后在Finish方法中继续操作。这样加载将在后台线程中进行,但您可以在UI线程上执行后加载操作。