2

我做了一些网络的事情,我知道我不能在主线程上做。所以,我把它放到了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在 line loadSeverOrder。我无法解释为什么。请帮我解决这个问题。

谢谢 :)

4

1 回答 1

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.

OrderTask另一种选择是从AsyncTask继承您的。但这完全是另一个故事

于 2013-03-31T06:02:09.770 回答