Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android工作线程_Java_Android_Multithreading - Fatal编程技术网

Java Android工作线程

Java Android工作线程,java,android,multithreading,Java,Android,Multithreading,我想用android做一个线程,在后面运行。线程通过while循环不断地检查时间,如果它匹配,它就会做一些事情。这一切都很好。但是这个应用程序没有响应,就好像我根本没有运行线程一样。而while仍然阻止了一切。我不明白为什么 线程的代码: public class AlarmThread implements Runnable { LocalTime beginTime; LocalTime endTime; public AlarmThread(LocalTime beginTime, L

我想用android做一个线程,在后面运行。线程通过while循环不断地检查时间,如果它匹配,它就会做一些事情。这一切都很好。但是这个应用程序没有响应,就好像我根本没有运行线程一样。而while仍然阻止了一切。我不明白为什么

线程的代码:

public class AlarmThread implements Runnable {

LocalTime beginTime;
LocalTime endTime;

public AlarmThread(LocalTime beginTime, LocalTime endTime) {
    this.beginTime = beginTime;
    this.endTime = endTime;
}

@Override
public void run() {
     while(true){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        currentTime = java.time.LocalTime.now();
        if(currentTime.isAfter(beginTime) && currentTime.isBefore(endTime)){
            sendNotification();
         }
      }
}
活动:

public void onButtonClickerDatepicker(View v) throws IOException {
    LocalTime beginTime = java.time.LocalTime.of(binding.simpleTimePicker.getHour(), binding.simpleTimePicker.getMinute());
    LocalTime endTime = java.time.LocalTime.of(binding.simpleTimePicker2.getHour(), binding.simpleTimePicker2.getMinute());
    alarmThread = new AlarmThread(beginTime, endTime);
    alarmThread.run();

}
调用
Thread.start()
以启动除
Thread.run()
以外的线程。 更重要的是,您的AlarmThread不是一个线程,而是一个可运行的线程。因此,您可以通过以下代码启动:

private Thread workerThread = new Thread(new AlarmThread(start, end))
...
...
workerThread.start()

我建议您使用灵活性

这是否必须在UI线程上?我的意思是,这个任务可以在后台完成吗?ui不需要更新。所以,是的,可以在后台进行,然后你应该让WorkManager试试。关于WorkManager的更多信息:我认为重要的是重复一下
AlarmThread
没有扩展
Thread
,因此应该重命名以避免类似的混淆,称之为
AlarmRunnable
或类似的名称。