Thursday, February 16, 2012

Alternative solutions for android.os.NetworkOnMainThreadException


Now I'm solving the




android.os.NetworkOnMainThreadException




I put the connect method into separated thread, but when the thread starts, the start() method doesn't invoke the Run() , - and also using the AsyncTask , the task doesn't invoke the doInBackground() method!





// For The AsyncTask my code was




public class ConnectTask extends AsyncTask<URL, Integer, HttpEntity> {

HttpEntity entity;
String statue;
LogInJSONActivity mainActivity;
@Override
protected HttpEntity doInBackground(URL... arg0) {
// TODO Auto-generated method stub
mainActivity.setString("Inside Do in background");
entity = connect(arg0[0]);
mainActivity.setHttp(entity);
return entity;
}

public HttpEntity connect(String url) {

statue= "Inside Connect";
HttpClient httpclient = new DefaultHttpClient();
// Prepare a request object
HttpGet httpget = new HttpGet(url);
// Execute the request
HttpResponse response;
HttpEntity entity = null;
try {
response = httpclient.execute(httpget);
entity = response.getEntity();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return entity;
}
public void setActivity(LogInJSONActivity act){
mainActivity = act;
}
}



-> In The Main Activity




URL url = null;
try {
url = new URL("http://www.flickr.com/photos/51469488@N03/");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ConnectTask backgroundTask = (ConnectTask) new ConnectTask();
backgroundTask.setActivity(this);
backgroundTask.execute(url);





// For The Thread My code Was :-




public class ConnectThread extends Thread {

HttpEntity entity;
String statue;
LogInJSONActivity mainActivity;
@Override
public void run() {
// TODO Auto-generated method stub
mainActivity.setString("Inside Run");
entity = connect("http://www.flickr.com/photos/51469488@N03/");
mainActivity.setHttp(entity);
super.run();
}

public HttpEntity connect(String url) {

statue= "Inside Connect";
HttpClient httpclient = new DefaultHttpClient();
// Prepare a request object
HttpGet httpget = new HttpGet(url);
// Execute the request
HttpResponse response;
HttpEntity entity = null;
try {
response = httpclient.execute(httpget);
entity = response.getEntity();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(entity !=null)
System.out.print("Valid Entity");
else
System.out.print("Null Entity");


return entity;
}
public void setActivity(LogInJSONActivity act){
mainActivity = act;
}
}





-> In the MainActivity




ConnectThread t = new ConnectThread();
t.setActivity(this);
t.start();

1 comment:

  1. Your error is probably because you are doing some Network Operation on your UI thread, which is not allowed from API 11.I would say not to create a seperate Thread, just use AsyncTask class to execute your Network operation. Just do your Network Operation in doInBackground() and call the AsyncTask class from the UI thread as,

    new YourAsyncTask().execute(url);


    Thats all no need to put much efforts by creating a seperate Thread class and making it more complicated.

    ReplyDelete