簡體   English   中英

Android線程錯誤-無法在未調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM