Question

I want to call a new AsyncTask from onPostExecute of the currently finished AsyncTask.

          protected void onPostExecute(Integer feed) {
        dialog1.dismiss();          
        super.onPostExecute(feed);
        new SendsequenceofRequest().execute();
    } 

But I'm receiving following exception:

        android.os.NetworkOnMainThreadException

My logcat output is:

09-30 16:08:19.517: W/System.err(3706): android.os.NetworkOnMainThreadException
09-30 16:08:19.517: W/System.err(3706):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1077)
09-30 16:08:19.517: W/System.err(3706):     at dalvik.system.BlockGuard$WrappedNetworkSystem.read(BlockGuard.java:279)
09-30 16:08:19.517: W/System.err(3706):     at org.apache.harmony.luni.net.PlainSocketImpl.read(PlainSocketImpl.java:448)
09-30 16:08:19.517: W/System.err(3706):     at org.apache.harmony.luni.net.SocketInputStream.read(SocketInputStream.java:75)
09-30 16:08:19.517: W/System.err(3706):     at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103)
09-30 16:08:19.517: W/System.err(3706):     at org.apache.http.impl.io.SocketInputBuffer.isStale(SocketInputBuffer.java:132)
09-30 16:08:19.517: W/System.err(3706):     at org.apache.http.impl.AbstractHttpClientConnection.isStale(AbstractHttpClientConnection.java:205)
09-30 16:08:19.517: W/System.err(3706):     at org.apache.http.impl.conn.AbstractClientConnAdapter.isStale(AbstractClientConnAdapter.java:185)
09-30 16:08:19.577: W/System.err(3706):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:336)
09-30 16:08:19.577: W/System.err(3706):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
09-30 16:08:19.577: W/System.err(3706):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
09-30 16:08:19.597: W/System.err(3706):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
09-30 16:08:19.597: W/System.err(3706):     at com.dm.ekot.reqres.SimpleHttpClient.sendresponseSequReqRes(SimpleHttpClient.java:715)
09-30 16:08:19.607: W/System.err(3706):     at com.dm.ekot.MainScreen$SendsequenceofRequest$1$1.run(MainScreen.java:1020)
09-30 16:08:19.620: W/System.err(3706):     at android.os.Handler.handleCallback(Handler.java:587)
09-30 16:08:19.620: W/System.err(3706):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-30 16:08:19.620: W/System.err(3706):     at android.os.Looper.loop(Looper.java:132)
09-30 16:08:19.620: W/System.err(3706):     at android.app.ActivityThread.main(ActivityThread.java:4025)
09-30 16:08:19.627: W/System.err(3706):     at java.lang.reflect.Method.invokeNative(Native Method)
09-30 16:08:19.627: W/System.err(3706):     at java.lang.reflect.Method.invoke(Method.java:491)
09-30 16:08:19.627: W/System.err(3706):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
09-30 16:08:19.627: W/System.err(3706):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
09-30 16:08:19.642: W/System.err(3706):     at dalvik.system.NativeStart.main(Native Method)

In my SendsequenceofRequest AsyncTask I do start another thread in doInBackground() method.

            class SendsequenceofRequest extends AsyncTask<String, Void, Integer> {

//  private ProgressDialog dialog1;

    protected void onPreExecute() {
    //  dialog1 = ProgressDialog.show(MainScreen.this, "", "Loading...");   
    }   

    protected void onPostExecute(Integer feed) {
    //  dialog1.dismiss();          
        super.onPostExecute(feed);
    }        

    @Override
    protected Integer doInBackground(String... arg0) {    

                   String  str_stater_menu = "Starters";
                   String response_starter = "";
                try {

                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            while (isThreadPaused1) {
                                try {
                                    Thread.sleep(3000);
                                    mHandler.post(new Runnable() {    

                                        @Override
                                        public void run() {
                                            // TODO Auto-generated method stub   
                                            try {
                                                final String response_req_sequence = SimpleHttpClient.sendresponseSequReqRes(response_send_order);
                                                System.out.println(" i  ma in thread");
                                                if(response_req_sequence != null)
    {
                                                     onPause();
         runOnUiThread(new Runnable() {    
                @Override  
                public void run() {    
                    // TODO Auto-generated method stub
                    Toast.makeText(getApplicationContext(), "Your Order will be delivered in"+response_req_sequence, 10000).show();
                }
            });
    }
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
                                        }
                                    });
                                } catch (Exception e) {  
                                    // TODO: handle exception
                                }
                            }
                        }
                    }).start();
                    //response_starter = SimpleHttpClient.sendFirstStarter(str_stater_menu);
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }    
                   System.out.println("i am getting response for starter"+response_starter);
                // str_reponse_request_tableid_ip = SimpleHttpClient.sendIpTabletId(url , str_ip);

               /** 
                *      
                */
                //  res = response_starter.toString();
                  System.out.println("response TEST: "+res);
            //   Object obj = response_starter.toString();
               System.out.println("after object creation ");

              // getJsonStringForStarter(response_starter);

               System.out.println("response :"+res);       

           /** Inside the new thread we cannot update the main thread
           So updating the main thread outside the new thread */
           try {   

           }catch (Exception e) {  
        e.printStackTrace();  
              // e.printStackTrace();
           }
        return null;
           }       


    }

When i go through several link i couldn't found any help as my issue. So please nay body help me to take me out of this issue. Thanks in advance to all.

Was it helpful?

Solution

I would suggest the use of publishProgress to publish the current progress and override onProgressUpdate which is executed on the main thread. With that, you won't have to use handlers and Threads in the AsyncTask at all.

Notice that the first line has changed from extends AsyncTask<String, Void, Integer> to extends AsyncTask<String, String, Integer>. The middle parameter determines the object type of the Update Parameter. If you need to send complex data to the update method, change it to a class containing all information necessary.

class SendsequenceofRequest extends AsyncTask<String, String, Integer> {
    @Override
    protected Integer doInBackground(String... arg0) {    
        try {
            // This will run indefinitely, unless stopped by break. So make sure you have an exit condition, see below
            String response_req_sequence = null;
            do {
                response_req_sequence = SimpleHttpClient.sendresponseSequReqRes(response_send_order);
                if(response_req_sequence != null) {
                    // Instead of calling runOnUiThread, call progress update
                    publishProgress(response_req_sequence);
                }

                // Wait before retry
                Thread.sleep(3000);

            // Keep in mind, that if the connection is successful, the string may be empty,
            // so TextUtils.isEmpty(response_req_sequence); may be better exit condition as it checks if string is null or has size of 0
            } while(response_req_sequence!=null);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    void onProgressUpdate(String... string) {
        // This will always be executed in main thread
        onPause();
        Toast.makeText(getApplicationContext(), "Your Order will be delivered in"+response_req_sequence, 10000).show();
    }

    protected void onPostExecute(Integer feed) {
        // Notify user the task has bene completed
        Toast.makeText(getApplicationContext(), "Task completed.", 10000).show();
    }        
}

OTHER TIPS

If mHandler was created from the main/UI thread, then any Runnables posted to it will also run on the main thread. Since you're trying to perform network I/O inside such a Runnable, the app is throwing a NetworkOnMainThreadException.

Runnable started by

mHandler.post(Runnable runnable);

is executed on main thread, and you are trying to use networking inside that runnable.

To avoid this problem simply create new thread and start it like this:

Thread t = new Thread(new Runnable {
...
});
t.start();
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top