在后台线程中运行处理程序消息

Yar*_*lyk 38 java multithreading android handler

我想在后台线程中运行一些Runnable.我想使用Handler,因为它很方便延迟.我的意思是

handler.post(runnable, delay);
Run Code Online (Sandbox Code Playgroud)

其中runnable应该在后台 Thread中运行.是否可以创建这样的Handler?在某处有"背景"Looper或者我该如何创建它?

PS我知道如何使用自定义类扩展Thread,但它需要比处理程序方式更多的编码工作.所以请不要发布其他解决方案或类似的东西

handler.post(new Runnable() {
    @Override
    public void run() {
        new Thread() {
            @Override
            public void run() {
                //action
            }
        }.start();
    }
});
Run Code Online (Sandbox Code Playgroud)

如果Handler能够以"干净"的方式做到这一点,我就会徘徊.

Him*_*wal 69

你可以这样做:

private Handler mHandler;

private HandlerThread mHandlerThread;

public void startHandlerThread(){
    mHandlerThread = new HandlerThread("HandlerThread");
    mHandlerThread.start();
    mHandler = new Handler(mHandlerThread.getLooper());
}
Run Code Online (Sandbox Code Playgroud)

然后调用:

mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
          // Your task goes here
        }
    },1000);
Run Code Online (Sandbox Code Playgroud)

  • 添加正确的序列来阻止所有事情会非常有帮助. (3认同)
  • 如果我想在运行中更新 UI,我需要调用 runonuithread? (2认同)

Aym*_*oub 8

你可以尝试这样的事情

    private void createHandler() {
        Thread thread = new Thread() {
            public void run() {
                Looper.prepare();

                final Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                       // Do Work
                        handler.removeCallbacks(this);
                        Looper.myLooper().quit();
                   }
                }, 2000);

                Looper.loop();
            }
        };
        thread.start();
    }
Run Code Online (Sandbox Code Playgroud)


Yui*_*aki 5

您可以使用Looper.prepare()和在后台线程中设置Looper Looper.loop.