Android 调用处理程序时是否需要调用Looper.prepare()
我需要了解活套的情况。Looper将咨询适当的处理程序来发送和处理与线程MessageQueue关联的消息和可运行对象 默认情况下,线程没有与其关联的消息循环,因此也没有循环器。要为线程创建一个循环器,并将该线程专用于串行处理来自消息循环的消息,可以使用Looper类 下面是我的代码,我没有显式调用LooperAndroid 调用处理程序时是否需要调用Looper.prepare(),android,multithreading,android-looper,Android,Multithreading,Android Looper,我需要了解活套的情况。Looper将咨询适当的处理程序来发送和处理与线程MessageQueue关联的消息和可运行对象 默认情况下,线程没有与其关联的消息循环,因此也没有循环器。要为线程创建一个循环器,并将该线程专用于串行处理来自消息循环的消息,可以使用Looper类 下面是我的代码,我没有显式调用Looper Thread background2 = new Thread(new Runnable() { @Override public vo
Thread background2 = new Thread(new Runnable() {
@Override
public void run() {
for ( int i = 0; i < 5; i++) {
final int v =i;
try { Thread.sleep(1000);
handler.post(new Runnable() {
@Override
public void run() {
txt.setText(txt.getText() + "Thread 2 current i : " + String.valueOf(v) +System.getProperty("line.separator"));
}
});
} catch (Exception e) {
Log.v("Error", e.toString());
}
}
}
});
threadbackground2=新线程(new Runnable(){
@凌驾
公开募捐{
对于(int i=0;i<5;i++){
最终int v=i;
试试{Thread.sleep(1000);
handler.post(新的Runnable(){
@凌驾
公开募捐{
txt.setText(txt.getText()+“线程2当前i:”+String.valueOf(v)+System.getProperty(“line.separator”);
}
});
}捕获(例外e){
Log.v(“错误”,例如toString());
}
}
}
});
这是否意味着task/runnable未放入队列?上面的代码和这个有什么区别
Thread background3 = new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
for ( int i = 0; i < 5; i++) {
final int v =i;
try { Thread.sleep(1000);
handler.post(new Runnable() {
@Override
public void run() {
txt.setText(txt.getText()+ "Thread 3 set : " + String.valueOf(v) +System.getProperty("line.separator"));
}
});
} catch (Exception e) {
Log.v("Error", e.toString());
}
}
Looper.loop();
}
});
threadbackground3=新线程(new Runnable(){
@凌驾
公开募捐{
Looper.prepare();
对于(int i=0;i<5;i++){
最终int v=i;
试试{Thread.sleep(1000);
handler.post(新的Runnable(){
@凌驾
公开募捐{
txt.setText(txt.getText()+“thread3 set:”+String.valueOf(v)+System.getProperty(“line.separator”);
}
});
}捕获(例外e){
Log.v(“错误”,例如toString());
}
}
loop.loop();
}
});
它们都访问同一个处理程序。它们都可以正常工作。为
线程创建活套
意味着您正在设置该线程
以接收来自其他线程
的消息。两个示例的行为完全相同,因为在第二个示例中,您没有向线程发送任何内容。也就是说,background3
的Looper
并没有真正被使用
在这两个示例中,您都将Runnable
发布到为主线程活套创建的处理程序。您没有为创建处理程序
,例如background2
。该处理程序
属于主线程
及其循环器
,您向其发布的任何内容都将放入主队列,并在主线程
上运行
示例中唯一的区别是,第二个线程
有一个活套
,如果愿意,您可以向其发送帖子。为此,您需要创建另一个属于background3
的Looper
的处理程序
,然后发布到该处理程序。但是,您没有这样做,因此第二个线程只会继续运行,而不做任何其他操作
一个线程
不需要一个活套
来简单地发布到另一个线程
的处理程序,这就是您的示例所要做的。另一个线程
——本例中的主线程
——已经准备并启动了它的活套
。您只需向它发送Runnable
s,您不需要自己的Looper
。aThread
不需要Looper
来发布到另一个线程的处理程序。示例中的处理程序
s用于其他线程
s,无论是在哪个线程
s上创建它们。您好,我现在很困惑,那么我的第二个示例有什么不同,我显式调用Looper.prepare(),但没有它,它仍然可以为线程创建活套
,这意味着其他线程
可以发布到它。您的示例中的活套
实际上没有做任何事情,因为您没有将任何内容发布到在那里创建的处理程序
,这就是为什么您看不出有什么不同。Mike,在这种情况下,其他线程可以向其发布什么??请你把它作为答案,好吧,这里有很多答案已经涵盖了这一点,所以我宁愿找到一个重复的答案,而不是张贴一个重复的答案。无论如何,在第二个示例中,由于您正在该线程中启动活套
,因此可以为该活套
创建一个处理程序
,将其传递给另一个线程
,然后另一个线程
可以向其发送。您的示例Thread
s将Runnable
s发布到为其创建处理程序的Thread
中。他们并不是在自己发布。如果我没有充分解释什么,让我知道。非常感谢迈克,我知道了。你在评论上发布的其他帖子解释说,作为一种管理线程,Looper过于笼统。但你的回答很清楚。