Wednesday, July 20, 2011

NetworkOnMainThreadException in Android

Something that used to work in Android 2.2 but stopped working in Android 3.0+ (Honeycomb) is executing long running processes (Http calls for example) from the main thread.  The exception you get is NetworkOnMainThreadException.  To fix this either utilize AsyncTask OR Handler patterns.

The following is my example for AsyncTask:

... this is inside an activity ...
   
    public void onCallService(View v){
        ServiceTask task = new ServiceTask();
        task.execute(new String[]{"http://www.ultimateworkoutdiary.com/BestStocksService.svc/10/DAY/1/ACTUAL"});
    }
   
    private class ServiceTask extends AsyncTask {
        @Override
        protected String doInBackground(String... urls) {
            String response = "";
            for (String url : urls) {
                DefaultHttpClient client = new DefaultHttpClient();
                HttpGet httpGet = new HttpGet(url);
                try {
                    HttpResponse execute = client.execute(httpGet);
                    InputStream content = execute.getEntity().getContent();

                    BufferedReader buffer = new BufferedReader(
                            new InputStreamReader(content));
                    String s = "";
                    while ((s = buffer.readLine()) != null) {
                        response += s;
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return response;
        }

        @Override
        protected void onPostExecute(String result) {
            Log.d("output", result);
        }
    }

No comments:

Labels