gpt4 book ai didi

Android HandlerThread 类

转载 作者:行者123 更新时间:2023-11-30 02:43:14 26 4
gpt4 key购买 nike

我正在使用 HandlerThread 来处理 Android 中的线程,

public class HandlerTest extends HandlerThread {
private static final int MESSAGE_TYPE0 = 0;
private static final String TAG = "TAG";

Handler mHandler;


public interface Listener {
void onHandlerTestDone(String str);
}



@SuppressLint("HandlerLeak")
@Override
protected void onLooperPrepared() {
Log.i(TAG, "OnLoopPrep");

mHandler = new Handler() {

@Override
public void handleMessage(Message msg) {

if (msg.what == MESSAGE_TYPE0) {
@SuppressWarnings("unchecked")
String msgObj = (String) msg.obj;
handleRequest(msgObj);
}
}
};
}

private void handleRequest(final String token) {
final String str = token;

try {
this.sleep(5000, 0);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
handleMessage(token);
}

public void clearQueue() {
mHandler.removeMessages(MESSAGE_TYPE0);
}
}

我有两个 Activity , Activity 1 调用 Activity 2,然后在 Activity 2 上我这样做

HandlerTest hlrtest;
protected void onCreate(Bundle savedInstanceState) {

hlrtest.start();// start looper
hlrtest.getLooper();
hlrtest.PrepMessage("test1"); //will be handled by the thread then
//the thread will go to sleep for 5 second
hlrtest.PrepMessage("test2"); //will be queued
hlrtest.PrepMessage("test3"); //will be queued
hlrtest.PrepMessage("test4"); //will be queued
//Now quit this activity and go back to Activity 1

@Override
public void onDestroy() {
super.onDestroy();
hlrtest.clearQueue();
hlrtest.quit();
}
}

如您所见,我让线程休眠 5 秒,以模拟它在这段时间内变得很忙。当我发送 4 个请求然后返回 Activity 1 时,线程将仅处理第一个请求并且队列将被清除并且线程将退出,因为 onDestroy() 将在返回 Activity 1 后执行此操作。

如果我不在销毁中调用 clearQueue() 和 quit(),我将以僵尸线程结束。

如何向线程发送多个请求,并希望线程处理所有请求,然后在队列为空时退出?

请注意,我不想使用 quitSafely(),因为它仅受 sdk 18 及更高版本支持

最佳答案

您可以创建另一种消息类型,向 Handler 发出清理和退出的信号。也许是这样的(未经测试的)handleMessage() 代码:

@Override
public void handleMessage(Message msg) {

if (msg.what == MESSAGE_TYPE0) {
@SuppressWarnings("unchecked")
String msgObj = (String) msg.obj;
handleRequest(msgObj);

} else if (msg.what == MESSAGE_TYPE_FINISH) {
mHandler.clearQueue();
mHandler.quit();
}
};

关于Android HandlerThread 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25466480/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com