HandlerThread

76 阅读1分钟

前言

频繁的开启线程和销毁线程是一种耗性能的操作。 解决办法:

  1. 使用线程池
  2. 使用HandlerThread

HandlerThread

可以执行多个耗时操作,而不需要多次开启线程,采用Handler和Looper实现。 HandlerThread是异步操作放在Handler消息队列中,是串行的,只适合并发量较少的耗时操作。

  • HandlerThread是一个Thread线程
  • Android 默认线程Thread中没有looper。HandlerTread内有looper
  • Handler中必须有looper,它是消息查询、分发、处理的核心,在创建Handler过程中可以指定任意线程的looper对象。
public class Test2 {
    private static final String TAG = "Test2";
    private static final int MESSAGE_CODE_GET = 1;
    private static final int MESSAGE_CODE_SET = 2;
    private static HandlerThread mHanderThread;
    private static Handler mThreadHandler;
    private static Handler mUiHandler;

    public static void test() {
        Log.d(TAG, "test: ");
        mHanderThread = new HandlerThread("HandlerThread");
        mHanderThread.start();
        mThreadHandler = new Handler(mHanderThread.getLooper()) {
            @Override
            public void handleMessage(Message msg) {
                Log.i(TAG, "mThreadHandler's thread: " + Thread.currentThread().getName());
                if (msg.what == MESSAGE_CODE_GET) {
                    try {
                        // 休眠 5 秒,模拟子线程处理耗时任务的过程。
                        Thread.sleep(5 * 1000);
                    } catch (InterruptedException ie) {
                        ie.printStackTrace();
                    }
                    // 向主线程 Handler 发送处理结果
                    mUiHandler.sendEmptyMessage(MESSAGE_CODE_SET);
                }
            }
        };
        mUiHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                Log.i(TAG, "mUiHandler's thread: " + Thread.currentThread().getName() + " what:" + msg.what);
                if (msg.what == MESSAGE_CODE_SET) {
                }
            }
        };
        mThreadHandler.sendEmptyMessage(MESSAGE_CODE_GET);
    }
    
    public static void quitSafely(){
        if (mHanderThread!=null) {
            mHanderThread.quitSafely();
        }
    }
}

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.d("test--", "onCreate")
        println("onCreate")
        setContent {
            LeetCode2Theme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    Greeting("Android")
                }
            }
        }
        Test2.test()
    }

    override fun onDestroy() {
        super.onDestroy()
        Test2.quitSafely()
    }
}
输出:
mThreadHandler's thread: HandlerThread
mUiHandler's thread: main what:2