0

我正在调用一个在主线程上执行网络操作的类,导致我的应用程序在更新的设备上崩溃。因此,我尝试将对该类的调用移动到我的主要活动中的 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。我知道我的 Amazon 类工作正常,所以我用 AsyncTask 做了一些事情,但我不知道?

4

3 回答 3

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);
        }
    }
}
于 2013-04-17T10:39:41.417 回答
1

这是因为您正在尝试使用AsyncTask尚未返回的值,就像AsyncTask运行asyncronously一样。

你应该把parseXmlFile(childrenBrowseNodesXml.getBrowseNodesXML());AsyncTaskonPostExecute()方法,像这样:

  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 nulldoInBackground方法中可能不是一个好方法,doInBackground返回的东西将作为参数onPostExecute()自动传递给方法AsyncTask

更多关于AsyncTask,请参考Android 开发者:AsyncTask

于 2013-04-17T10:40:47.807 回答
0

问题是,您创建了一个后台线程 ( AsyncTask),它会在一段时间后(实际执行时)填充 childrenBrowseNodesXml,但您尝试在活动代码中立即使用它。

将您的 parseXMLFile 移动到onPostExecute(Void result)AsyncTask 的方法。

于 2013-04-17T10:39:28.623 回答