我做了一些网络事情,我明白我不能在主线程上做。所以,我把它放到了Handler中。这是我的代码:
handler = new Handler();
handler.postDelayed(new OrderTask(this, url), 10 * 1000); // periodically run every 10 seconds.
这是我的Runnable类:
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();
}
}
但是当它运行时,它会在行NetworkOnMainThread
处抛出异常:loadSeverOrder
。我无法解释原因。请帮我算一下这个。
谢谢:)
答案 0 :(得分: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
。但这完全是另一个故事