我做了一些網絡的事情,我明白我不能在主線程上做到這一點。所以,我把它放入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 loadSeverOrder
NetworkOnMainThread
。我無法解釋爲什麼。請幫我理解這一點。
謝謝:)
'Handler'將在創建它的線程上執行代碼。因此,如果'handler = new Handler()'在你的UI線程上運行(很可能是),那麼任何'Runnable'都將在main上執行。 – 323go
@ 323go是否真的如此?我一直認爲Handler會自動添加新的線程來運行工作。我認爲Handler製造的原因是 – hqt
是的,這是真的。 「當你創建一個新的Handler時,它綁定到創建它的線程的線程/消息隊列」(來自Handler文檔)。處理程序的存在正好可以訪問一個線程。如果你想要一個新的線程 - 創建一個! 'Thread myThread = new Thread(runnable);' – 323go