I have created an app which retrieves the data from a url using xml pull parser.It is working fine on emulator but when i test it in tab it is showing networkonmainthread exception.My code is:
package com.example.androidsample4;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URL;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class UNIXclass extends Activity
{
String unixcommands[];
AutoCompleteTextView actv1;
protected URL params;
static final String URL="http://cympac.com/apps/xmlfile.xml";
static final String KEY_COMMAND = "command"; // parent node
static final String KEY_WORD = "word";
static final String KEY_EXPLANATION = "explanation";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv1=(TextView)findViewById(R.id.textView1);
AutoCompleteTextView actv=(AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
Button b1=(Button)findViewById(R.id.button1);
unixcommands=getResources().getStringArray(R.array.Commands);
ArrayAdapter<String> adapter =new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1,unixcommands);
actv1 = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
actv1.setThreshold(1);
actv1.setAdapter(adapter);
b1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v)
{
Mytask task=new Mytask();
task.doInBackground(params);
}
});
}
private class Mytask extends AsyncTask<java.net.URL, Void, Void>
{
@Override
protected Void doInBackground(java.net.URL... params)
{
TextView myXmlContent = (TextView)findViewById(R.id.textView2);
String stringXmlContent = null;
try {
stringXmlContent = getEventsFromAnXML(); // 54 line
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
Toast.makeText(getBaseContext(), "error:"+e.getMessage(), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
// TODO Auto-generated catch block
Toast.makeText(getBaseContext(), "error:"+e.getMessage(), Toast.LENGTH_SHORT).show();
}
myXmlContent.setText(stringXmlContent);
return null;
}
}
public String getEventsFromAnXML() throws XmlPullParserException,IOException
{
StringBuffer stringBuffer=new StringBuffer();
java.net.URL url=new java.net.URL("http://cympac.com/apps/xmlfile.xml");
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp=factory.newPullParser();
//xpp.setInput(getInputStream(url),"UTF-8"); //84 line
xpp.setInput(url.openConnection().getInputStream(), "UTF-8");
int eventType = xpp.getEventType();
String word = null;
String tag;
while ((eventType = xpp.next()) != XmlPullParser.END_DOCUMENT)
{
if(XmlPullParser.START_TAG==eventType)
{
tag=xpp.getName();
//stringBuffer.append("\n"+tag);
if (tag.equals("word"))
{
eventType = xpp.next();
word = xpp.getText();
}
else if (tag.equals("explanation"))
{
eventType = xpp.next();
//if ("cancel".equals(word))
if(actv1.getText().toString().equals(word))
{
stringBuffer.append("\n" + xpp.getText());
}
}
}
}
return stringBuffer.toString();
}
}
I read that when we have to use network then we shuld use Asynctask.So i used it,But still it is showing the same error.
Please help me to solve this.
logcat o/p
08-21 16:36:41.087 E/AndroidRuntime( 4076): FATAL EXCEPTION: main
08-21 16:36:41.087 E/AndroidRuntime( 4076): android.os.NetworkOnMainThreadException
08-21 16:36:41.087 E/AndroidRuntime( 4076): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at java.net.InetAddress.lookupHostByName(InetAddress.java:477)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:277)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at java.net.InetAddress.getAllByName(InetAddress.java:249)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:69)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:304)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:292)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:274)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1038)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:523)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at com.example.androidsample4.SANclass.getEventsFromAnXML(SANclass.java:115)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at com.example.androidsample4.SANclass$Mytask.doInBackground(SANclass.java:92)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at com.example.androidsample4.SANclass$1.onClick(SANclass.java:58)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at android.view.View.performClick(View.java:3131)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at android.view.View$PerformClick.run(View.java:12035)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at android.os.Handler.handleCallback(Handler.java:587)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at android.os.Handler.dispatchMessage(Handler.java:92)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at android.os.Looper.loop(Looper.java:132)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at android.app.ActivityThread.main(ActivityThread.java:4123)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at java.lang.reflect.Method.invokeNative(Native Method)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at java.lang.reflect.Method.invoke(Method.java:491)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
08-21 16:36:41.087 E/AndroidRuntime( 4076): at dalvik.system.NativeStart.main(Native Method)
08-21 16:36:41.092 V/AudioPolicyManager( 2713): releaseOutput() 1
08-21 16:36:41.092 W/ActivityManager( 2891): Force finishing activity com.example.androidsample4/.SANclass
I am getting force close if i include “new Mytask.execute()” method.What could be the reason for this?Please guide me…
Dont update the UI in back ground thread.It should be done in
onPostExecute()Do this steps in onPostExecute()
Read my previous post