2

I am getting the NetworkOnMainThreadException while executing the two network requests in AsyncTask. In first request I get the Response XML and in second request, I download the Image InputStream to be used in BitmapFactory.decodeStream. Please find below the exception:

NetworkOnMainThreadException

07-10 08:20:49.961: W/System.err(8570): android.os.NetworkOnMainThreadException
07-10 08:20:49.961: W/System.err(8570):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
07-10 08:20:49.961: W/System.err(8570):     at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)
07-10 08:20:49.971: W/System.err(8570):     at libcore.io.IoBridge.recvfrom(IoBridge.java:513)
07-10 08:20:49.971: W/System.err(8570):     at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
07-10 08:20:49.971: W/System.err(8570):     at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
07-10 08:20:49.971: W/System.err(8570):     at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
07-10 08:20:49.981: W/System.err(8570):     at java.io.BufferedInputStream.read(BufferedInputStream.java:304)

AyncTask

public class FetchDataTask extends AsyncTask {

    @Override
    protected Object doInBackground(Object... object) {
        String url = (String)object[0];
        TASK_TYPE type = (TASK_TYPE)object[1];
        Object[] objects = new Object[4];
        switch(type)
        {
        case FETCH_NOTICES:
            publishProgress("Fetching notices ...");

             // Request # 1 to get the JSON XML

            String data = apiRequestGET(url);
            ArrayList<Notices> notices = extractUserFriendsDataFromXML(data);
            Notices notice = notices.get(0);

            publishProgress("Fetching done.");
            objects[0] = type;
            objects[1] = new ArrayList<Notices>(notices.subList(1, notices.size()));
            objects[2] = notice.getUniversityTitle();
            try {

             // Request # 2 to get the InputStream

                objects[3] = (InputStream) new URL(notice.getUniversityLogo()).getContent();
            } catch (MalformedURLException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            return objects; 
        }

        return null;
    }

    private String apiRequestGET(String requestString)
    {
        HttpClient httpClient = new DefaultHttpClient();
        HttpContext localContext = new BasicHttpContext();
        HttpGet httpGet = new HttpGet(requestString);

        String responseText = null;
        try 
        {
            HttpResponse response = httpClient.execute(httpGet, localContext);
            System.out.println("Some Response" +response);
            HttpEntity entity = response.getEntity();
            responseText = EntityUtils.toString(entity);
        }
        catch (Exception e1) 
        {
            return e1.getLocalizedMessage();
        }
        return responseText;
    }

}

Can anyone please tell me what I am doing wrong? Two network requests in doInBackground can not be done?

Thanks in advance!

Edit Full Stack Trace

07-10 08:52:18.672: W/System.err(9213): android.os.NetworkOnMainThreadException
07-10 08:52:18.682: W/System.err(9213):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
07-10 08:52:18.682: W/System.err(9213):     at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)
07-10 08:52:18.682: W/System.err(9213):     at libcore.io.IoBridge.recvfrom(IoBridge.java:513)
07-10 08:52:18.692: W/System.err(9213):     at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
07-10 08:52:18.692: W/System.err(9213):     at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
07-10 08:52:18.692: W/System.err(9213):     at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
07-10 08:52:18.702: W/System.err(9213):     at java.io.BufferedInputStream.read(BufferedInputStream.java:304)
07-10 08:52:18.702: W/System.err(9213):     at libcore.net.http.FixedLengthInputStream.read(FixedLengthInputStream.java:45)
07-10 08:52:18.702: W/System.err(9213):     at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:168)
07-10 08:52:18.702: W/System.err(9213):     at java.io.BufferedInputStream.read(BufferedInputStream.java:309)
07-10 08:52:18.712: W/System.err(9213):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
07-10 08:52:18.712: W/System.err(9213):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:529)
07-10 08:52:18.712: W/System.err(9213):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:601)
07-10 08:52:18.722: W/System.err(9213):     at com.alpha.noticeslist.NoticeListActivity.dataFetched(NoticeListActivity.java:145)
07-10 08:52:18.722: W/System.err(9213):     at com.alpha.web.FetchDataTask.onPostExecute(FetchDataTask.java:124)
07-10 08:52:18.732: W/System.err(9213):     at android.os.AsyncTask.finish(AsyncTask.java:631)
07-10 08:52:18.732: W/System.err(9213):     at android.os.AsyncTask.access$600(AsyncTask.java:177)
07-10 08:52:18.732: W/System.err(9213):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
07-10 08:52:18.732: W/System.err(9213):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-10 08:52:18.742: W/System.err(9213):     at android.os.Looper.loop(Looper.java:137)
07-10 08:52:18.742: W/System.err(9213):     at android.app.ActivityThread.main(ActivityThread.java:5041)
07-10 08:52:18.752: W/System.err(9213):     at java.lang.reflect.Method.invokeNative(Native Method)
07-10 08:52:18.752: W/System.err(9213):     at java.lang.reflect.Method.invoke(Method.java:511)
07-10 08:52:18.752: W/System.err(9213):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-10 08:52:18.752: W/System.err(9213):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-10 08:52:18.762: W/System.err(9213):     at dalvik.system.NativeStart.main(Native Method)

I get the error while a function called from onPostExecute inwhich InputStream is being passed as:

public void dataFetched(InputStream inputstream)
    {       
            Bitmap bitmap = BitmapFactory.decodeStream(inputstream);
            logo.setImageBitmap(bitmap);
    }

onPostExecute

@Override
    protected void onPostExecute(Object result){
        statusDialog.dismiss();
        Object[] objects = (Object[])result;
        TASK_TYPE type = (TASK_TYPE)objects[0];
        switch(type)
        {
        case FETCH_NOTICES:
        ((NoticeListActivity)callerActivity).dataFetched((InputStream)objects[3]);
        break;
        }
    }
Mustansar Saeed
  • 2,730
  • 2
  • 22
  • 46
  • Why I am getting down voted? I am performing two requests in `AsyncTask` and getting `NetworkOnMainThreadException`, Its problem that I am facing, Why down voted instead of answers? – Mustansar Saeed Jul 10 '14 at 08:41
  • What did you learn when you Googled for this exception or read some of the hundreds of questions on this site related to it? – Simon Jul 10 '14 at 08:41
  • how you are calling AsyncTask.. can we see the code – DCoder Jul 10 '14 at 08:42
  • 1
    @Simon: `NetworkOnMainThreadException` occurs when you try to run network request on main thread, I am performing network requests in `AsyncTask`, still gets the exception. Its also mentioned in the Question header. – Mustansar Saeed Jul 10 '14 at 08:43
  • @DCoder: `FetchDataTask task = new FetchDataTask(this); task.execute(url, TASK_TYPE.FETCH_NOTICES);` – Mustansar Saeed Jul 10 '14 at 08:44
  • are you sure that the stacktrace points to this AsyncTask? – Blackbelt Jul 10 '14 at 08:47
  • Post your full logcat trace and highlight the exact line in which you are getting the error – zozelfelfo Jul 10 '14 at 08:51
  • `decodeStream` reads from an InputStream. From where does this InputStream came? Is it the result of a Network operation? – Blackbelt Jul 10 '14 at 09:13
  • Yes, it is coming from `onPostExecute` of `AsyncTask` – Mustansar Saeed Jul 10 '14 at 09:34
  • post your `onPostExecute` method – zozelfelfo Jul 10 '14 at 09:36
  • ` @Override protected void onPostExecute(Object result){ statusDialog.dismiss(); Object[] objects = (Object[])result; TASK_TYPE type = (TASK_TYPE)objects[0]; switch(type) { case FETCH_NOTICES: ((NoticeListActivity)callerActivity).dataFetched((InputStream)objects[3]); break; } } – Mustansar Saeed Jul 10 '14 at 09:39
  • possible duplicate of [android.os.NetworkOnMainThreadException](http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception) – JiTHiN Jul 10 '14 at 09:43

4 Answers4

2

I think you are getting the error because although you get a reference to the InputStream in your background thread, you actually read from the stream when you call decodeStream in onPostExecute, which runs on the main thread

Move the call:

Bitmap bitmap = BitmapFactory.decodeStream(inputstream);

into doInBackground and pass the bitmap back rather than the inputstream

dave.c
  • 10,910
  • 5
  • 39
  • 62
0

Make sure that you are calling to myFetchDataTask.execute(). Are you calling to doInBackground() directly, if that is the case it will not work, if not, please post how you execute your AsyncTask.

Hope it helps!

zozelfelfo
  • 3,776
  • 2
  • 21
  • 35
0

Use the below code for async task:

private class FetchDataTask  extends AsyncTask <String, Void, Void>

{
Object[] objects = new Object[4];
protected void onPreExecute() {
}
@Override
protected Void doInBackground(String... paramsObj) {
    String url = (String)object[0];
    TASK_TYPE type = (TASK_TYPE)object[1];

    switch(type)
    {
    case FETCH_NOTICES:
        publishProgress("Fetching notices ...");

        // Request # 1 to get the JSON XML

        String data = apiRequestGET(url);
        ArrayList<Notices> notices = extractUserFriendsDataFromXML(data);
        Notices notice = notices.get(0);

        publishProgress("Fetching done.");
        objects[0] = type;
        objects[1] = new ArrayList<Notices>(notices.subList(1, notices.size()));
        objects[2] = notice.getUniversityTitle();
        try {

            // Request # 2 to get the InputStream

            objects[3] = (InputStream) new URL(notice.getUniversityLogo()).getContent();
        } catch (MalformedURLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }

    return null;
}

protected void onPostExecute(Void unused) 
{
    // Do action with objects
}

}

From the calling method, use:

new FetchDataTask().execute();
ngrashia
  • 9,869
  • 5
  • 43
  • 58
0

your class sholud be:

class FetchDataTask extends AsyncTask<Object, String, Void> 
    {

        @Override
        protected Void doInBackground(Object... params) {
            //code here

            publishProgress("");

            return null;
        }

        @Override
        protected void onProgressUpdate(String... values) {
            // TODO Auto-generated method stub
            super.onProgressUpdate(values);
        }
    }

you can execute like new FetchDataTask.execute([your parameter]);

DCoder
  • 3,486
  • 7
  • 36
  • 68