user3183409
user3183409

Reputation: 35

NetworkOnMainThreadException Even After Implementing AsyncTask

I'm not sure exactly what's going on here but I've implemented AsyncTask and I'm still getting a NetworkOnMainThreadException and I have no idea why.

The error occurs on the line (116):

HttpResponse httpResponse = httpClient.execute(httpPost);

Which I find strange since it is within doInBackground.

Any suggestions?

Source:

import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import android.os.AsyncTask;
import android.util.Log;

public class XMLParser extends AsyncTask {

    // constructor
    public XMLParser() {

    }

    /**
     * Getting XML from URL making HTTP request
     * 
     * @param url
     *            string
     * */

    /**
     * Getting XML DOM element
     * 
     * @param XML
     *            string
     * */
    public Document getDomElement(String xml) {
        Document doc = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {

            DocumentBuilder db = dbf.newDocumentBuilder();

            InputSource is = new InputSource();
            is.setCharacterStream(new StringReader(xml));
            doc = db.parse(is);

        } catch (ParserConfigurationException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (SAXException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        } catch (IOException e) {
            Log.e("Error: ", e.getMessage());
            return null;
        }

        return doc;
    }

    /**
     * Getting node value
     * 
     * @param elem
     *            element
     */
    public final String getElementValue(Node elem) {
        Node child;
        if (elem != null) {
            if (elem.hasChildNodes()) {
                for (child = elem.getFirstChild(); child != null; child = child
                        .getNextSibling()) {
                    if (child.getNodeType() == Node.TEXT_NODE) {
                        return child.getNodeValue();
                    }
                }
            }
        }
        return "";
    }

    /**
     * Getting node value
     * 
     * @param Element
     *            node
     * @param key
     *            string
     * */
    public String getValue(Element item, String str) {
        NodeList n = item.getElementsByTagName(str);
        return this.getElementValue(n.item(0));
    }

    protected Object doInBackground(String url) {
        // TODO Auto-generated method stub

        String xml = null;

        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            xml = EntityUtils.toString(httpEntity);

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // return XML
        return xml;
    }

    @Override
    protected Object doInBackground(Object... params) {
        // TODO Auto-generated method stub
        return null;
    }
}

LOGCAT:

01-20 10:47:14.396: E/AndroidRuntime(1629): FATAL EXCEPTION: main
01-20 10:47:14.396: E/AndroidRuntime(1629): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidhive.xmlparsing/com.androidhive.xmlparsing.AndroidXMLParsingActivity}: android.os.NetworkOnMainThreadException
01-20 10:47:14.396: E/AndroidRuntime(1629):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at android.app.ActivityThread.access$700(ActivityThread.java:140)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at android.os.Looper.loop(Looper.java:137)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at android.app.ActivityThread.main(ActivityThread.java:4921)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at java.lang.reflect.Method.invokeNative(Native Method)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at java.lang.reflect.Method.invoke(Method.java:511)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at dalvik.system.NativeStart.main(Native Method)
01-20 10:47:14.396: E/AndroidRuntime(1629): Caused by: android.os.NetworkOnMainThreadException
01-20 10:47:14.396: E/AndroidRuntime(1629):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at java.net.InetAddress.getAllByName(InetAddress.java:214)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at com.androidhive.xmlparsing.XMLParser.doInBackground(XMLParser.java:116)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at com.androidhive.xmlparsing.AndroidXMLParsingActivity.onCreate(AndroidXMLParsingActivity.java:46)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at android.app.Activity.performCreate(Activity.java:5206)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
01-20 10:47:14.396: E/AndroidRuntime(1629):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
01-20 10:47:14.396: E/AndroidRuntime(1629):     ... 11 more
01-20 10:47:14.406: I/Process(1629): Sending signal. PID: 1629 SIG: 9
01-20 10:48:04.316: D/AbsListView(2017): Get MotionRecognitionManager
01-20 10:48:04.331: D/AndroidRuntime(2017): Shutting down VM
01-20 10:48:04.331: W/dalvikvm(2017): threadid=1: thread exiting with uncaught exception (group=0x40ff42a0)
01-20 10:48:04.331: E/AndroidRuntime(2017): FATAL EXCEPTION: main
01-20 10:48:04.331: E/AndroidRuntime(2017): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidhive.xmlparsing/com.androidhive.xmlparsing.AndroidXMLParsingActivity}: android.os.NetworkOnMainThreadException
01-20 10:48:04.331: E/AndroidRuntime(2017):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at android.app.ActivityThread.access$700(ActivityThread.java:140)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at android.os.Looper.loop(Looper.java:137)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at android.app.ActivityThread.main(ActivityThread.java:4921)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at java.lang.reflect.Method.invokeNative(Native Method)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at java.lang.reflect.Method.invoke(Method.java:511)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at dalvik.system.NativeStart.main(Native Method)
01-20 10:48:04.331: E/AndroidRuntime(2017): Caused by: android.os.NetworkOnMainThreadException
01-20 10:48:04.331: E/AndroidRuntime(2017):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at java.net.InetAddress.getAllByName(InetAddress.java:214)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at com.androidhive.xmlparsing.XMLParser.doInBackground(XMLParser.java:116)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at com.androidhive.xmlparsing.AndroidXMLParsingActivity.onCreate(AndroidXMLParsingActivity.java:46)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at android.app.Activity.performCreate(Activity.java:5206)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
01-20 10:48:04.331: E/AndroidRuntime(2017):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
01-20 10:48:04.331: E/AndroidRuntime(2017):     ... 11 more

Upvotes: 1

Views: 181

Answers (2)

nhaarman
nhaarman

Reputation: 100358

You are not using the asynctask like you should. Call AsyncTask.execute(), and it will call doInBackground for you. In fact, it will call the empty stub for you. You should move your code.

Upvotes: 2

nKn
nKn

Reputation: 13761

You have two doInBackground() methods, one is the override of the AsyncTask's method, where you just return null, and the other one is a custom implementation as the parameters don't match.

The network operations should be done in the overrided method doInBackground(), if you do them in your own customized method, you will get that exception.

Upvotes: 2

Related Questions