在Android上,我有一个扩展Thread的MyThread类。在MyThread中,我声明了一些对象并在run()方法中初始化它们。对象是具有自己的构造函数的自定义类的实例。其中一些触发另一个后台线程并接受也在MyThread的run()方法内初始化的侦听器对象。我的问题是,这些侦听器是在主线程而不是MyThread上执行的。
所以我的问题是:在自定义Thread上实例化的自定义对象的方法是什么?
答案 0 :(得分:3)
创建哪些线程对象并不重要,重要的是从哪个线程调用对象上的方法。
例如:
class MyThread extends Thread {
public MyObject myObject;
@Override
public void run() {
myObject = new MyObject();
/* Do stuff */
}
}
使用此课程:
MyThread myThread = new MyThread();
myThread.start();
myThread.myObject.someMethod();
此处,someMethod
调用已在主线程上完成 。
答案 1 :(得分:1)
对于他们实例化的线程并不重要,可以从任何引用它们的线程中访问对象(以及您的侦听器)(无论它是否为安全这样做是另一个问题。)
对象不存在于任何线程上 - 当您从线程A调用对象上的方法时,该方法中的代码将在线程A上运行,而不管创建对象的线程如何。 / p>
答案 2 :(得分:0)
当一个节目开始时,它在聚会前是一个空房间。然后爱丽丝带着她的手提袋进来,开始清理东西。过了一段时间,爱丽丝打电话给鲍勃,后来鲍勃来到厨房帮助爱丽丝。爱丽丝和鲍勃准备了一些糖果,过了一会儿,史蒂夫和莎拉用啤酒和薯条敲门。
爱丽丝,鲍勃,史蒂夫和莎拉都是线程。爱丽丝是主线,因为她组织了派对。糖果,啤酒和薯条是对象。请注意,史蒂夫带来了芯片,但爱丽丝也可以吃掉它们!莎拉负责啤酒,但其他人肯定会喝酒。谁(哪个线程)将什么(创建的对象)带到聚会上并不重要:内存在thred之间共享。
现在,让我们来看看你的爱丽丝是如何工作的。 Android应用程序的主要线程是一个事件循环,可以看作:
while (running) {
if (input != null) dispatch(input);
sleepForSomeTime();
}
对dispatch()
的调用最终会触及您的侦听器代码,以便在处理触摸事件的同一线程上执行 。创建对象,注册听众的人等等并不重要。
我认为您的应用程序并非如此,但实际上可能需要在后台线程池中处理事件。这是通过为线程提供要完成的任务队列,以及让事件驱动的代码更新该队列(或者您可以在java.util.concurrent
中使用执行程序框架)
作为注释,您不应该在构造函数中启动线程,因为