我正在调用一个在主线程上执行网络操作的类,导致我的应用程序在更新的设备上爆炸。所以我尝试将对该类的调用转移到我的主要活动中的AsyncTask内部类中。但是现在我得到空参考考试。
这是我的AsyncTask:
private class RetreiveAmazonNodesXML extends AsyncTask {
private Exception exception;
@Override
protected Object doInBackground(Object... params) {
try {
childrenBrowseNodesXml = new Amazon(browseNodeId, locality);
} catch (Exception e) {
this.exception = e;
}
return null;
}
}
这就是我在活动中称之为的地方:
RetreiveAmazonNodesXML test = new RetreiveAmazonNodesXML();
test.execute();
parseXmlFile(childrenBrowseNodesXml.getBrowseNodesXML());
childrenBrowseNodesXml未获得更新并返回null。我知道我的亚马逊类工作正常,所以我正在使用AsyncTask,但我不知道?
答案 0 :(得分:2)
使用回调从异步任务中获取结果。这里是接口回调类:
public interface Callback {
public void onSuccess(Object data);
public void onError(String errorMsg);
}
创建此类的实例并实现其:
final Callback resCallback = new Callback() {
@Override
public void onSuccess(Object data) {
parseXmlFile(data);
}
@Override
public void onError(String errorMsg) {
//show error with Alert or Toast
}
};
使用回调创建asynctask类:
RetreiveAmazonNodesXML test = new RetreiveAmazonNodesXML(resCallback);
test.execute(yourObjectsParams);
像这样编写asynctask类:
private class RetreiveAmazonNodesXML extends AsyncTask {
private Callback responderCallback;
private Exception exception;
public GeneralHttpTask(Callback callback){
this.responderCallback = callback;
}
@Override
protected Object doInBackground(Object... params) {
try {
Amazon childrenBrowseNodesXml = new Amazon(browseNodeId, locality);
return childrenBrowseNodesXml;
} catch (Exception e) {
this.exception = e;
}
return null;
}
@Override
protected void onPostExecute(Object result) {
if(result != null) {
responderCallback.onSuccess(result);
} else {
responderCallback.onError(exception);
}
}
}
答案 1 :(得分:1)
这是因为您尝试使用AsyncTask
未返回的值,因为AsyncTask
正在运行 asyncronously 。
您应该将parseXmlFile(childrenBrowseNodesXml.getBrowseNodesXML());
放入AsyncTask
的{{1}}方法中,如下所示:
onPostExecute()
此外, private class RetreiveAmazonNodesXML extends AsyncTask {
private Exception exception;
@Override
protected Object doInBackground(Object... params) {
try {
childrenBrowseNodesXml = new Amazon(browseNodeId, locality);
} catch (Exception e) {
this.exception = e;
}
return null;
}
@Override
protected void onPostExecute(Object obj) {
parseXmlFile(childrenBrowseNodesXml.getBrowseNodesXML());
}
}
方法中的return null
可能不是一个好方法,doInBackground
返回的内容将自动作为参数传递给doInBackground
方法onPostExecute()
1}}。
有关AsyncTask
的详情,请参阅Android Developers: AsyncTask
答案 2 :(得分:0)
问题是,您创建了一个后台线程(AsyncTask
),它在一段时间后(实际执行时)填充了childrenBrowseNodesXml,但您尝试在活动代码中立即使用它。
将parseXMLFile移动到AsyncTask的onPostExecute(Void result)
方法。