Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 调用处理程序时是否需要调用Looper.prepare()_Android_Multithreading_Android Looper - Fatal编程技术网

Android 调用处理程序时是否需要调用Looper.prepare()

Android 调用处理程序时是否需要调用Looper.prepare(),android,multithreading,android-looper,Android,Multithreading,Android Looper,我需要了解活套的情况。Looper将咨询适当的处理程序来发送和处理与线程MessageQueue关联的消息和可运行对象 默认情况下,线程没有与其关联的消息循环,因此也没有循环器。要为线程创建一个循环器,并将该线程专用于串行处理来自消息循环的消息,可以使用Looper类 下面是我的代码,我没有显式调用Looper Thread background2 = new Thread(new Runnable() { @Override public vo

我需要了解活套的情况。Looper将咨询适当的处理程序来发送和处理与线程MessageQueue关联的消息和可运行对象

默认情况下,线程没有与其关联的消息循环,因此也没有循环器。要为线程创建一个循环器,并将该线程专用于串行处理来自消息循环的消息,可以使用Looper类

下面是我的代码,我没有显式调用Looper

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

a
Thread
不需要
Looper
来发布到另一个
线程的
处理程序
。示例中的
处理程序
s用于其他
线程
s,无论是在哪个
线程
s上创建它们。您好,我现在很困惑,那么我的第二个示例有什么不同,我显式调用Looper.prepare(),但没有它,它仍然可以为
线程创建
活套
,这意味着其他
线程
可以发布到它。您的示例中的
活套
实际上没有做任何事情,因为您没有将任何内容发布到在那里创建的
处理程序
,这就是为什么您看不出有什么不同。Mike,在这种情况下,其他线程可以向其发布什么
??请你把它作为答案,好吧,这里有很多答案已经涵盖了这一点,所以我宁愿找到一个重复的答案,而不是张贴一个重复的答案。无论如何,在第二个示例中,由于您正在该
线程中启动
活套
,因此可以为该
活套
创建一个
处理程序
,将其传递给另一个
线程
,然后另一个
线程
可以向其发送。您的示例
Thread
s将
Runnable
s发布到为其创建
处理程序的
Thread
中。他们并不是在自己发布。如果我没有充分解释什么,让我知道。非常感谢迈克,我知道了。你在评论上发布的其他帖子解释说,作为一种管理线程,Looper过于笼统。但你的回答很清楚。