前言
频繁的开启线程和销毁线程是一种耗性能的操作。 解决办法:
- 使用线程池
- 使用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