Android:使用Handler但仍然符合NetworkOnMainThreadException

时间:2013-03-31 05:25:54

标签: android handler

我做了一些网络事情,我明白我不能在主线程上做。所以,我把它放到了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。我无法解释原因。请帮我算一下这个。

谢谢:)

1 个答案:

答案 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。但这完全是另一个故事