Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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
Java 每个安卓线程都与Looper(消息队列)关联吗?_Java_Android_Multithreading - Fatal编程技术网

Java 每个安卓线程都与Looper(消息队列)关联吗?

Java 每个安卓线程都与Looper(消息队列)关联吗?,java,android,multithreading,Java,Android,Multithreading,我试图理解线程、处理程序和循环器。我看了一段视频,guy说跟随每个Android线程与Looper(消息队列)关联。这意味着当我创建线程类实例时,它隐式地创建它自己的循环器,它连接到这个线程?还是这是错误的?处理程序连接到创建它的线程,如果在处理程序将发布消息的每个线程中没有循环器? 另一个问题是关于HandlerThread。使用这个类的目的是什么,优点和缺点是什么。 我希望你的帮助。提前谢谢大家 编辑 例如,我想知道在仅仅调用之后,Looper是否与线程相关联 Thread=新线程() 或者

我试图理解线程、处理程序和循环器。我看了一段视频,guy说跟随每个Android线程与Looper(消息队列)关联。这意味着当我创建线程类实例时,它隐式地创建它自己的循环器,它连接到这个线程?还是这是错误的?处理程序连接到创建它的线程,如果在处理程序将发布消息的每个线程中没有循环器? 另一个问题是关于HandlerThread。使用这个类的目的是什么,优点和缺点是什么。 我希望你的帮助。提前谢谢大家

编辑 例如,我想知道在仅仅调用之后,Looper是否与线程相关联
Thread=新线程()
或者您应该为调用Looper.prepare()的线程指定明确的lopper;在线程中,依次隐式地创建与调用方法的线程相关联的循环器的新实例。正如我在Looper类的源代码中看到的,它在prepare中调用ThreadLocal.get,在何处获取当前线程。所以结论是默认情况下并没有和简单线程关联的活套?我说得对吗? 我还注意到处理程序的所有构造函数都调用处理程序(回调回调,布尔异步)。Looper.myLooper();方法被调用。 据我所知,这意味着跟随

Thread myThread = new Thread(new Runnable() {
public void run() {
//some stuff here 
}
});
myThread.start();
这里没有与线程关联的活套。 下一个例子

  Thread myThread = new Thread(new Runnable() {
    public void run() {
     Handler myHandler = new Handler();
    }
    });
    myThread.start();
 Thread myThread = new Thread(new Runnable() {
        public void run() {
         Looper.prepare();
        }
        });
        myThread.start();
在这里,在创建处理程序的新实例时,处理程序将与looper隐式关联。 下一个例子

  Thread myThread = new Thread(new Runnable() {
    public void run() {
     Handler myHandler = new Handler();
    }
    });
    myThread.start();
 Thread myThread = new Thread(new Runnable() {
        public void run() {
         Looper.prepare();
        }
        });
        myThread.start();
在本例中,将通过调用prepare方法来显式地创建loooper。 我是对的?请评论

编辑2

第二个例子将导致

java.lang.RuntimeException:无法在该线程内创建处理程序 没有调用Looper.prepare()这样的异常,所以结论是 仅调用Looper.prepare()的线程


);将有自己的循环器,否则在这样的线程中创建处理程序时会导致异常。

根据我的理解,循环器和处理程序只是帮助器类,用于轻松处理线程中的生成和处理消息。但是线程除了处理消息外,还可以做任何事情。

线程通过调用
Looper.prepare()
与消息队列关联。随后在该线程中创建的任何
处理程序
都将与同一消息队列相关联。线程通过调用
Looper.loop()
开始处理其消息队列。循环器线程通常除了处理自己的消息队列外不会做任何事情。

基本上是正确的,但最后一个示例是无用的。调用
Looper.prepare()
后,它需要创建一个
处理程序
并将其公开在某个地方,以便其他线程可以向队列投递,然后调用
Looper.loop()
开始处理队列。正如您所写的,它将创建消息队列,然后不执行任何操作并退出。顺便说一句,虽然知道它是如何工作的很好,但是没有什么好的理由来创建自己的活套。@嘿,伙计们,只有当它调用
Looper.prepare()
时,才会发出警告。