![](/img/trans.png)
[英]Android Studio Error: Can't create handler inside thread that has not called Looper.prepare()
[英]Android thread error - Can't create handler inside thread that has not called Looper.prepare()
我正在嘗試讓計時器在單獨的線程中運行。
我的onCreate函數之前有以下聲明:
TimerTask scanTask;
Timer t = new Timer();
然后是onCreate中的以下代碼:
Runnable runnable = new Runnable() {
@Override
public void run() {
scanTask = new TimerTask() {
@Override
public void run() {
System.out.println("timer test");
}
};
t.schedule(scanTask, 0, 5000);
CountDownTimer waitTimer;
waitTimer = new CountDownTimer(20000,300) {
@Override
public void onTick(long l) {
}
@Override
public void onFinish() {
t.cancel();
System.out.println("Timer stopped");
}
}.start();
}
};
Thread periodic_scan = new Thread(runnable);
periodic_scan.start();
但是,當我運行該應用程序時,它崩潰並給了我錯誤: java.lang.RuntimeException:無法在未調用Looper.prepare()的線程內創建處理程序
我不確定我是否完全理解為什么會發生此錯誤。 與UI線程有關嗎? 另外,我不確定我嘗試實現此方法的方式是否正確。 這是我第一次嘗試處理Android中的線程。
你可以像這樣使用HandlerThread
HandlerThread handlerThread = new HandlerThread("name");
handlerThread.start();
Handler threadHandler = new Handler(handlerThread.getLooper(),new Callback() {
public boolean handleMessage(Message msg) {
return true;
}
});
我最終對代碼進行了一些更改,並決定使用Thread
類:
class TimerThread extends Thread {
TimerTask scanTask;
Timer t = new Timer();
@Override
public void run() {
Looper.prepare();
scanTask = new TimerTask() {
public void run() {
System.out.println("timer test");
}
};
t.schedule(scanTask, 0, 5000);
CountDownTimer waitTimer;
waitTimer = new CountDownTimer(20000,300) {
@Override
public void onTick(long l) {
}
@Override
public void onFinish() {
t.cancel();
System.out.println("Timer stopped");
}
}.start();
Looper.loop();
}
}
在onCreate
我使用了以下內容:
new TimerThread().start();
該程序現在可以正常運行了,但是唯一的問題是,在UI呈現到屏幕之前加載該程序時,會有明顯的2-3秒的延遲。
我不確定如果我使用的計時器功能在單獨的線程上運行,為什么會發生這種情況,除非我在這里錯過了什么...
如果創建處理程序(或您調用的任何類都創建處理程序),則它必須位於具有Looper且已調用Looper.prepare()的線程中。 TimerTask或CountDownTimer都可以這樣做。 如何解決它取決於您要將事件發布到何處。 如果要在UI線程上使用它們,則必須在UI線程上創建處理程序。 如果要在此線程上使用它們,則需要在某個時候調用Looper.prepare和Looper.loop。
UI線程已經有一個循環器(框架會為您啟動),因此始終可以在其中進行處理程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.