0

我想AsyncTaskonPostExecute当前完成的AsyncTask.

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

但我收到以下异常:

        android.os.NetworkOnMainThreadException

我的 logcat 输出是:

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)

在我SendsequenceofRequest AsyncTask的方法中,我确实启动了另一个线程doInBackground()

            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;
           }       


    }

当我通过几个链接时,我找不到任何帮助作为我的问题。所以请不要帮我把我从这个问题中解脱出来。在此先感谢大家。

4

3 回答 3

2

我建议使用在主线程上执行的publishProgress发布当前进度和覆盖。onProgressUpdate有了它,您根本不必使用处理程序和线程AsyncTask

请注意,第一行已从 更改extends AsyncTask<String, Void, Integer>extends AsyncTask<String, String, Integer>。中间参数决定了更新参数的对象类型。如果您需要将复杂数据发送到更新方法,请将其更改为包含所有必要信息的类。

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();
    }        
}
于 2013-09-30T16:41:12.170 回答
0

如果mHandler是从主/UI 线程创建的,那么Runnable发布到它的任何 s 也将在主线程上运行。由于您试图在这样的内部执行网络 I/O Runnable,因此应用程序正在抛出NetworkOnMainThreadException.

于 2013-09-30T15:57:26.660 回答
0

可运行开始于

mHandler.post(Runnable runnable);

在主线程上执行,并且您正在尝试在该可运行文件中使用网络。

为了避免这个问题,只需创建新线程并像这样启动它:

Thread t = new Thread(new Runnable {
...
});
t.start();
于 2013-09-30T16:12:02.683 回答