Reputation: 35
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?
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;
}
}
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
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
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