无法让异步任务工作

时间:2013-04-17 10:34:37

标签: android android-asynctask

我正在调用一个在主线程上执行网络操作的类,导致我的应用程序在更新的设备上爆炸。所以我尝试将对该类的调用转移到我的主要活动中的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,但我不知道?

3 个答案:

答案 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)方法。