Java TimerTask中的NetworkOnMainThreadException

Java TimerTask中的NetworkOnMainThreadException,java,android,multithreading,networking,udp,Java,Android,Multithreading,Networking,Udp,我需要从Android应用程序连续广播UDP数据包,因此我创建了一个从TimerTask派生的类。当我试图从我的TimerTask中更新UI元素时,应用程序崩溃,这告诉我它在单独的线程上运行 但是,当我尝试发送UDP数据包时,由于出现NetworkOnMainThreadException,应用程序崩溃 // simplified public class UdpDiscoveryTask extends TimerTask { private final DatagramSocket

我需要从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);
    }

}
@覆盖
公开募捐{
new SendTask().exectue(null,null,null);
}
类SendTask扩展了AsyncTask{
公共void doInBackground(void..params){
DatagramPacket packet=新的DatagramPacket(“Hello”.getBytes()…);
_socket.send(包);
}
}

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

取自


By@Rasel

TimerTask
通常在后台线程IIRC上执行
run()
。您如何使用
TimerTask
?你能发布堆栈跟踪吗?您是否考虑过切换到
ScheduledExecutorService
?发布堆栈跟踪。这可能表明你不能在构造函数中构造DatagramSocket。我笨得像面包一样。我尝试使用
.run()
而不是使用
计时器调用
TimerTask
。它现在可以工作了,但我更喜欢您的
AsyncTask
方法。非常感谢。
@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);

    }


}
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
}