Shayan Pourvatan
Shayan Pourvatan

Reputation: 11948

android.os.NetworkOnMainThreadException in AsynkTask Class

i want to get data from the internet with JSON, i'm using an AsynkTask class to do that and its working, but if i add or change any code and run my program again it stops working with android.os.NetworkOnMainThreadException But i never ran this code on the main thread, and i must click on fix project, then clean project and run again and it works fine again, what is the problem? My code that is working is as follows:

    public class NetworkDocStateThread extends AsyncTask<String, Void, Void> {

    HttpResponse responseState;

    @Override
    protected Void doInBackground(String... params) {

        try {
            responseState = JsonDocumnet
                    .SendDocumentState(Financial.selectedGuId);

        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void post) {
        try {

            Financial.documnetStateDs = JsonDocumnet
                    .DocumentState(responseState);

                documentStateSpinner.add(Financial.documnetStateDs.get(i)
                        .getTitle());
            }

            SpinnerStateAdapter = new ArrayAdapter<String>(Documnet.this,
                    R.layout.spinnlayout, R.id.docstateid,
                    documentStateSpinner);


            SpinnerNumAdapter = new ArrayAdapter<String>(Documnet.this,
                    R.layout.spinnlayout, R.id.docstateid, getResources()
                            .getStringArray(R.array.numPerPage));

            SpinnerSortAdapter = new ArrayAdapter<String>(Documnet.this,
                    R.layout.spinnlayout, R.id.docstateid, getResources()
                    .getStringArray(R.array.SortBy));

            new NetworkDocThread().execute(Financial.selectedGuId, "5",

                    "0", "Id", "-1");

            docStateSpinner.setAdapter(SpinnerStateAdapter);
            NumberPerPageSpinner.setAdapter(SpinnerNumAdapter);
            SortBySpinner.setAdapter(SpinnerSortAdapter);

        } catch (IllegalStateException e) {

            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }

        super.onPostExecute(post);
    }

}

and second AsyncTask class:

public class NetworkDocThread extends AsyncTask<String, Void, Void> {

    HttpResponse responseDoc;

    @Override
    protected Void doInBackground(String... s) {
        try {
            responseDoc = JsonDocumnet.SendDocumnet(s[0], s[1], s[2], s[3],
                    s[4]);

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void post) {


            try {
                Financial.docs = JsonDocumnet.Document(responseDoc);
                CreatingData();

            } catch (IOException e) { 
                e.printStackTrace();
            } catch (JSONException e) {
                ;
            }

            dialog.dismiss();


        }
    }
}

and manifest file:

   <uses-permission android:name="android.permission.INTERNET" />

and my LogCat error

    12-03 05:08:43.022: E/AndroidRuntime(1106): FATAL EXCEPTION: main
    12-03 05:08:43.022: E/AndroidRuntime(1106): android.os.NetworkOnMainThreadException
    12-03 05:08:43.022: E/AndroidRuntime(1106):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
    12-03 05:08:43.022: E/AndroidRuntime(1106):     at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)
    12-03 05:08:43.022: E/AndroidRuntime(1106):     at libcore.io.IoBridge.recvfrom(IoBridge.java:513)
    12-03 05:08:43.022: E/AndroidRuntime(1106):     at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
    12-03 05:08:43.022: E/AndroidRuntime(1106):     at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
    12-03 05:08:43.022: E/AndroidRuntime(1106):     at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
    12-03 05:08:43.022: E/AndroidRuntime(1106):     at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
    12-03 05:08:43.022: E/AndroidRuntime(1106):     at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:134)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:174)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:159)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at java.io.InputStreamReader.read(InputStreamReader.java:244)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at java.io.BufferedReader.fillBuf(BufferedReader.java:130)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at java.io.BufferedReader.readLine(BufferedReader.java:354)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at json.JsonDocumnet.Documen(JsonDocumnet.java:200)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at activity.Documnet$NetworkDocThread.onPostExecute(Documnet.java:375)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at activity.Documnet$NetworkDocThread.onPostExecute(Documnet.java:1)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at android.os.AsyncTask.finish(AsyncTask.java:631)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at android.os.AsyncTask.access$600(AsyncTask.java:177)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at android.os.Handler.dispatchMessage(Handler.java:99)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at android.os.Looper.loop(Looper.java:137)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at android.app.ActivityThread.main(ActivityThread.java:5041)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at java.lang.reflect.Method.invokeNative(Native Method)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at java.lang.reflect.Method.invoke(Method.java:511)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
   12-03 05:08:43.022: E/AndroidRuntime(1106):  at dalvik.system.NativeStart.main(Native Method)

I'm using 2 AsynkTask classes because i need the data of the first class in the second class and I cannot do network I/O in onPostExecute of an AsyncTask.

EDIT////////////////////

and Documen function:

    public static DocumentDS Documen(HttpResponse response) throws IOException, JSONException 
{
    String split[] ;
    List<DocumentInfoDS> dslis = new ArrayList<DocumentInfoDS>();
    split = response.getStatusLine().toString().split(" ");
    for (int i = 0 ; i < split.length ; i++)
    {
        Log.d("status code is", split[i]);
    }
    Log.d("status code is", split[1]);

    switch (Integer.valueOf(split[1])/100) 
    {           
    case 2:

        Log.d("IN Switch STATMENT", "2");
        in = new BufferedReader(new InputStreamReader(response
                    .getEntity().getContent()));


        StringBuffer sb = new StringBuffer("");
        String line = "";
        String NL = System.getProperty("line.separator");

        while ((line = in.readLine()) != null) {
            Log.d("line is", line);
            sb.append(line + NL);
        }

        Log.d("after setting data", "1234");
        in.close();
        json = sb.toString();

        JSONObject jsonObj = new JSONObject(json);
        docs = new DocumentDS();
        docs.SetDocCount(jsonObj.getInt(TAG_Count));
        JSONArray jsonArray = new JSONArray(jsonObj.getString(TAG_Docs));




        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject temp = jsonArray.getJSONObject(i);
            DocumentInfoDS ds = new DocumentInfoDS();

            ds.SetGuId(temp.getString(TAG_Id));
            ds.SetTitle(temp.getString(TAG_Title));
            ds.SetStateID(temp.getInt(TAG_StateId));
            ds.SetCreateDate( temp.getString(TAG_CreateDate));
            ds.SetDocumnetNumber(temp.getInt(TAG_DocumentNum));

            dslis.add(ds);
            }

        docs.SetList(dslis);



        Log.d("lenght is", String.valueOf(dslis.size()));
        break;
    }
    return docs;

line 200 is while ((line = in.readLine()) != null)

Upvotes: 0

Views: 400

Answers (3)

Neha Shukla
Neha Shukla

Reputation: 3660

When you perform Network Connection task like fetching data from Server in Main Thread then this issue comes. It is recommended to perform such tasks in doInbackground() method of AsyncTask or you can also avoid this issue by putting the code below in onCreate() of Activity :

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
StrictMode.setThreadPolicy(policy);

I hope it would solve your problem when you have already written lots of code in Main Thread.

Upvotes: 0

Gopal Gopi
Gopal Gopi

Reputation: 11131

You merely getting a reference of HttpResponse in doInBackground. but all the read/write operations on HttpResponse also involves network operation. and you are reading from HttpResponse in onPOstExecute() which runs in UI Thread. and try this...

public class NetworkDocStateThread extends AsyncTask<String, Void, Void> {


    @Override
    protected Void doInBackground(String... params) {

        try {
            HttpResponse responseState = JsonDocumnet
                    .SendDocumentState(Financial.selectedGuId);
            Financial.documnetStateDs = JsonDocumnet
                    .DocumentState(responseState);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void post) {
        try {


            documentStateSpinner.add(Financial.documnetStateDs.get(i)
                    .getTitle());

            SpinnerStateAdapter = new ArrayAdapter<String>(Documnet.this,
                    R.layout.spinnlayout, R.id.docstateid,
                    documentStateSpinner);

            SpinnerNumAdapter = new ArrayAdapter<String>(Documnet.this,
                    R.layout.spinnlayout, R.id.docstateid, getResources()
                            .getStringArray(R.array.numPerPage));

            SpinnerSortAdapter = new ArrayAdapter<String>(Documnet.this,
                    R.layout.spinnlayout, R.id.docstateid, getResources()
                            .getStringArray(R.array.SortBy));

            new NetworkDocThread().execute(Financial.selectedGuId, "5",

            "0", "Id", "-1");

            docStateSpinner.setAdapter(SpinnerStateAdapter);
            NumberPerPageSpinner.setAdapter(SpinnerNumAdapter);
            SortBySpinner.setAdapter(SpinnerSortAdapter);

        } catch (IllegalStateException e) {

            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }

        super.onPostExecute(post);
    }

}

Upvotes: 1

Hiren Patel
Hiren Patel

Reputation: 52790

Try to add this below code on onCreate(Bundle bundle)

@Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                    .permitAll().build();
    StrictMode.setThreadPolicy(policy);

//your code 
}

Upvotes: 1

Related Questions