2012-07-09 47 views
0

我正在使用以下代碼在特定時間後更新列表。Android定時器和NetworkOnMainThreadException

Myactivity { 
    setTimer() { 
     Runnable r = new Runnable() { 
      run() { 
       if(!isListUpdated) { 
        update();//n/w operation 
       } else { 
        show();//this is a UI operation 
        listupdated = false; 
       } 

       Handler.postDelayed(this,next); //repeat after next 
      } 

      new Thread(r).start(); 
     } 
    } 
} 

經過2 - 3次迭代後,它給出NetworkOnMainThreadException。有人可以告訴這段代碼有什麼問題嗎?

回答

2

你應該不要在主線程中做網絡操作。創建一個單獨的線程並在那裏執行新操作。

您可以使用的AsyncTask服務單獨的線程。你會在哪裏做網絡操作。並通過BroadcastReceiver,Handler或AsyncTask進行更新。

閱讀有關的AsyncTask here

2

此異常當您嘗試在主線程中執行網絡操作通常發生。爲您的網絡操作使用AsyncTask

1

考慮使用runOnUiThread在非UI線程中執行UI操作。

你的代碼片段應該如下所示。

Runnable runnable = new Runnable() { 

    public void run() { 
     if (!isListUpdated) { 
      runOnUiThread(new Runnable() { 

       public void run() { 
        update(); //n/w operation 

       } 
      }); 

     } else { 
      runOnUiThread(new Runnable() { 

       public void run() { 
        show(); //n/w operation 

       } 
      }); 
      listupdated = false; 
     } 

     handler.postDelayed(runnable, next); 
    } 
}; 
1

NetworkOnMainThreadException

當應用程序試圖在其主線程執行 網絡操作時引發的異常。

所以你需要使用ThreadrunOnUiThreadAsyncTaskHandler,或HandlerThread從後臺線程更新UI元素。使用線程和runOnUiThread


一個例子:

public void myThread(){ 
    Thread th=new Thread() { 
     @Override 
     public void run() { 
      try 
      { 
       while(true) { 
        Current_Activity.this.runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
        //UPDATE UI FROM HERE 
         } 
        }); 
       } 
      }catch (InterruptedException e) { 
       // TODO: handle exception 
      } 
     } 
    }; 

    th.start(); 
} 
+0

我已經更新了示例代碼,它是否具有可運行r執行n/w操作的獨立線程? – user1254554 2012-07-09 07:15:29

0

我猜你正在使用蜂窩版本,你最好使用的AsyncTask將解決您的問題。

相關問題