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();
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,
ReplyDeletenew YourAsyncTask().execute(url);
Thats all no need to put much efforts by creating a seperate Thread class and making it more complicated.