2013-03-31 56 views
2

我做了一些網絡的事情,我明白我不能在主線程上做到這一點。所以,我把它放入Handler。這裏是我的代碼:Android:使用處理程序,但仍然符合NetworkOnMainThreadException

handler = new Handler(); 
handler.postDelayed(new OrderTask(this, url), 10 * 1000); // periodically run every 10 seconds. 

這裏是我運行的類:

public class OrderTask implements Runnable { 

    OrderFragment fragment; 
    String url; 

    public OrderTask(OrderFragment fragment, String url) { 
     this.fragment = fragment; 
     this.url = url; 
    } 

    @Override 
    public void run() { 
     synchronized (fragment.orders) { 
      fragment.orders = Order.loadServerOrders(url); // network code here 
     } 
     fragment.adapter.notifyDataSetChanged(); 
    } 
} 

但是,當它運行時,它拋出無線本地環路例外:在line loadSeverOrderNetworkOnMainThread。我無法解釋爲什麼。請幫我理解這一點。

謝謝:)

+1

'Handler'將在創建它的線程上執行代碼。因此,如果'handler = new Handler()'在你的UI線程上運行(很可能是),那麼任何'Runnable'都將在main上執行。 – 323go

+0

@ 323go是否真的如此?我一直認爲Handler會自動添加新的線程來運行工作。我認爲Handler製造的原因是 – hqt

+0

是的,這是真的。 「當你創建一個新的Handler時,它綁定到創建它的線程的線程/消息隊列」(來自Handler文檔)。處理程序的存在正好可以訪問一個線程。如果你想要一個新的線程 - 創建一個! 'Thread myThread = new Thread(runnable);' – 323go

回答

4

處理器將發佈Runnable同一線程的消息隊列它是從創建。

您可能會考慮使用ScheduledExecutorService在單獨的線程中定期運行某些內容。

下面是該代碼示例:

ScheduledExecutorService worker = Executors.newSingleThreadScheduledExecutor(); 

worker.scheduleAtFixedRate(new OrderTask(this, url), 
          0, //initial delay 
          10, //run every 10 seconds 
          TimeUnit.SECONDS); 

請注意,如果你改變了你的工人中的UI元素 - 你需要做的UI框架內。爲此,您可以使用Handler

另一種選擇是從AsyncTask繼承您的OrderTask。但這完全是另一回事

+0

謝謝:)但現在工人將工作,雖然我的活動/片段已關閉。我希望它會與我的活動/片段同時關閉。我怎樣才能做到這一點 ?謝謝:) – hqt

+0

工人有'shutdown()'方法。只需將'worker.shutdown()'添加到您的活動的/片段的'onDestroy()' –

+0

謝謝!例如,創建由帕維爾寫的東西之前,你必須聲明你的可運行,並創建了Runnable cada5MinutosIncidencias =新的Runnable(){\t \t \t \t @覆蓋 \t \t \t公共無效的run(){ \t \t \t \t日誌.d(LOG_TAG_TAREAS,「Actualizando incidencias」+ getFechaHoraActual()); \t \t \t \t ConnectionDetector cd = new ConnectionDetector(getApplicationContext()); \t \t \t \t \t \t \t if(cd。isConnectedToInternet()){ \t \t \t \t \t字符串語言= 「是」; \t \t \t \t \t IncidenciasParser IncidenciasParser IP =新(); \t \t \t \t \t mIncidencias = ip.parse(語言); \t \t \t \t} \t \t \t \t \t \t \t \t \t }}; – russellhoff

相關問題