【问题标题】:NetworkOnMainThreadException in TimerTaskTimerTask 中的 NetworkOnMainThreadException
【发布时间】:2014-08-24 22:02:31
【问题描述】:

我需要不断地从 Android 应用程序广播 UDP 数据包,因此我创建了一个派生自 TimerTask 的类。当我尝试从 TimerTask 中更新 UI 元素时,应用程序崩溃了,这告诉我它在单独的线程上运行。

但是,当我尝试发送 UDP 数据包时,应用程序由于 NetworkOnMainThreadException 而崩溃。

// simplified
public class UdpDiscoveryTask extends TimerTask {

    private final DatagramSocket _socket;

    public UdpDiscoverytAsk() {
        _socket = new DatagramSocket(PORT);
    }

    @Override
    public void run() {
        DatagramPacket packet = new DatagramPacket("Hello".getBytes().....);
        _socket.send(packet);
    }

}

【问题讨论】:

  • TimerTask 通常在后台线程 IIRC 上执行 run()。您如何使用TimerTask?你可以发布堆栈跟踪吗?你有没有考虑切换到ScheduledExecutorService
  • 发布堆栈跟踪。很可能说明不能在构造函数中构造DatagramSocket。

标签: java android multithreading networking udp


【解决方案1】:

您是否尝试过使用从 TimerTask 反复调用的 AsyncTask?

取自this question

public void callAsynchronousTask() {
    final Handler handler = new Handler();
    Timer timer = new Timer();
    TimerTask doAsynchronousTask = new TimerTask() {       
        @Override
        public void run() {
            handler.post(new Runnable() {
                public void run() {       
                    try {
                        PerformBackgroundTask performBackgroundTask = new PerformBackgroundTask();
                        // PerformBackgroundTask this class is the class that extends AsynchTask 
                        performBackgroundTask.execute();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                    }
                }
            });
        }
    };
    timer.schedule(doAsynchronousTask, 0, 50000); //execute in every 50000 ms
}

@Rasel

【讨论】:

  • 我笨得像个面包。我尝试使用.run() 而不是Timer 调用TimerTask。它现在有效,但我更喜欢您的 AsyncTask 方法。谢谢。
【解决方案2】:
@override 
public void run() {

 new SendTask().exectue(null,null,null);
}



 class SendTask extends AsyncTask<Void,Void,Void> {


    public void doInBackground(Void.. params) {

         DatagramPacket packet = new DatagramPacket("Hello".getBytes().....);
    _socket.send(packet);

    }


}

【讨论】:

    猜你喜欢
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多