我确定我的问题的解决方案将是其中之一" duh"时刻,但我被卡住了,所以任何有用的提示都会被感激地收到。
问题:我有一个带后台线程的UI。 UI有一个启动/停止按钮,用于启动并停止线程中的进程。这是通过使用消息从UI到包含在looper中的线程中的消息处理程序来实现的。线程进程在一个while循环中,依赖于线程消息处理程序的布尔值设置为true / false。但是,一旦启动,就不会再处理其他消息,并且循环会无限期地继续。
private class MyThread extends Thread{
public void run() {
Looper.prepare();
MyThreadChildHandler = new Handler() {
public void handleMessage(Message msg) {
switch(msg.arg1) {
case START:
boolLoop = true;
doWhileLoop();
case STOP:
boolLoop = false;
}
};
Looper.loop();
}
private void doWhileLoop(){
while (boolLoop = true){
stuff.do
}
finish.do
}
}
我从UI上获取了一条关于STOP消息的logcat消息并且该消息已被触发,但该线程从未接收它,因为它卡在while循环中并且消息处理程序没有& #39; t了解一下。
有没有办法让线程处理程序在各个点检查while循环内的消息?或者是否有其他方法可以根据来自UI的消息获得基于线程的连续while循环来启动和停止?
干杯 安迪
答案 0 :(得分:2)
变化:
while (boolLoop = true){
stuff.do
}
为:
while (boolLoop == true){
stuff.do
}
或者最好
while (booloop){
stuff.do
}
您需要检查是否相等(==)而不是分配(=)。
另外一件事是你不需要一个looper对象。只需使用while循环控制它。我会这样做:
我会让线程无限期地执行它的进程,直到它超时或来自控制该线程的处理程序的消息通过在两个类(如Activity和Thread)之间共享的标志变量来停止该线程的执行。活动的状态控制线程的位置。例如,假设应用程序进入后台,那就是当你将running flag设置为false时,它就会停止。您的Looper
执行不是必需的。消息传递的方式也是通过处理程序。