在我的程序中,我有一个BroadcastReceiver
,我正在创建一个新的Bluetooth ConnectedThread。
ConnectedThread thread = new ConnectedThread(btSocket);
thread.start();
但是我需要在不同的范围内访问这个线程(接收器以外的方法)。 thread.write(bytesWrite);
我不想创建另一个线程,我需要访问现有线程。而且,我不能在接收器之外声明线程,因为我不能放置未知参数(btSocket)。
如何解决这个问题?
答案 0 :(得分:0)
执行此操作的一种方法是保留对刚刚创建的线程的subprocess.Popen
引用。在您收到的时候,请执行:
static
然后,无论您在哪个班级,都可以通过public YourReceiver extends BroadcastReceiver {
@Nullable public static ConnectedThread thread;
public void onReceive(...) {
thread = new ConnectedThread(btSocket);
thread.start();
}
}
引用该帖子。
这种方法的主要缺点是保留对YourReceiver.thread
的静态引用是浪费的(ConnectionThread
不会是GC,直到你发布该引用为止)所以make确保您在完成任务时将其取消。
您可能遇到的另一个问题是确保在使用之前检查线程的内部状态,即它是否仍在运行或已经完成执行。
答案 1 :(得分:0)
您至少有3个主题:
要获取ConnectThread的引用,您需要在线程2(创建ConnectThread的线程)和线程3(不同范围内的线程)中可用的内容。
一个简单的方法可能是,让ThreadHolder类具有一个保存线程引用的静态变量:
public class ThreadHolder{
public static ConnectedThread connectedThread
}
在主题2中设置引用:
ConnectedThread thread = new ConnectedThread(btSocket);
ThreadHolder.connectedThread=thread;
thread.start();
在第3个主题中你会找到它:
ConnectedThread thread = ThreadHolder.connectedThread=thread;
//now do what you need with the thread
或者,您可以在线程2中为ConnectedThread指定名称:
thread.setName( “connectedThread”)
使用此方法在htread 3中找到它:
public Thread getThreadByName(String threadName) {
for (Thread t : Thread.getAllStackTraces().keySet()) {
if (t.getName().equals(threadName)) return t;
}
return null;
}