KingFu
KingFu

Reputation: 1358

Can't get async task to work

I was calling a class which was performing network operations on the main thread, causing my app to blow up on more recent devices. So I've tried moving the call to the class into a AsyncTask inner class in my main activity. However now i'm getting null reference expections.

Here's my 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;
        }


     }

And here's where I call it in my activity:

 RetreiveAmazonNodesXML test = new RetreiveAmazonNodesXML();
 test.execute();
 parseXmlFile(childrenBrowseNodesXml.getBrowseNodesXML());

childrenBrowseNodesXml isn't getting updated and returning null. I know my Amazon class works fine so its something im doing with AsyncTask, but I have no idea?

Upvotes: 0

Views: 176

Answers (3)

SBotirov
SBotirov

Reputation: 14128

Use callback for get result from async task. Here interface callback class:

public interface Callback {
    public void onSuccess(Object data);
    public void onError(String errorMsg);
}

And create instance this class and implement its:

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
}
};

And create asynctask class with your callback:

RetreiveAmazonNodesXML test = new RetreiveAmazonNodesXML(resCallback);
test.execute(yourObjectsParams);

Write asynctask class like this:

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);
        }
    }
}

Upvotes: 2

dumbfingers
dumbfingers

Reputation: 7089

It is because you're trying to use the value that AsyncTask hasn't returned, as AsyncTask is running asyncronously.

You should put parseXmlFile(childrenBrowseNodesXml.getBrowseNodesXML()); into your AsyncTask's onPostExecute() method, like this:

  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());

    }

 }

Also, return null in doInBackground method may not be a good manner, the stuff that doInBackground returns will be passed as a parameter to onPostExecute() method automatically by AsyncTask.

For more about the AsyncTask, please refer to the Android Developers: AsyncTask

Upvotes: 1

lopisan
lopisan

Reputation: 7830

The problem is, that you create a background thread (AsyncTask) that fills the childrenBrowseNodesXml after a while (when it's actually executed), but you try to use it immediately in your activity code.

Move your parseXMLFile to onPostExecute(Void result) method of AsyncTask instead.

Upvotes: 0

Related Questions