我有一个包含三个线程的Android应用程序,主线程和两个工作线程。线程需要定期相互通信。
我最初是以一种可怕的方式做到这一点,这里的每个人都会对我大喊大叫。我在每个线程中保存了线程的实例,如果线程需要该功能,则从其他线程调用该类的方法。它奏效了,但我知道它不对。
由于这是错误的,我回过头来将线程的每个实例更改为线程处理程序的实例,并且每个线程函数调用我用handler.sendMessage调用替换。
现在该计划不起作用。它只是冻结,我不知道最近会发生什么。当使用调试透视图时,我逐步完成主线程,但我得到的只是函数
boolean hasMessages(Handler h, int what, Object object)
{
...
}
来自MessageQueue的。其他线程在他们的run()函数中循环,它没有做任何令人兴奋的事情。我的日志都没有打印。我对正在发生的事情感到茫然,我不知道接下来我应该采取什么步骤来继续调试它。我改变的只是添加处理程序和发送消息。你们可以建议我应该采取哪些后续步骤进行调试吗?
编辑:这是一些代码,我没有运气
主要活动:
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
connectionStatusTextView = (TextView) findViewById(R.id.connectionStatus);
imageView = (ImageView) findViewById(R.id.imageView);
commandView = (TextView)findViewById(R.id.commandView);
focusView = (TextView)findViewById(R.id.focusView);
mApplication = ((myApplication) this.getApplication());
ConnectedThread connectedThread = new ConnectedThread(mHandler, mApplication);
VoiceRecognitionThread voiceThread = new VoiceRecognitionThread(mApplication, this);
connectedThread.setHandlers(mHandler, voiceThread.getHandler());
voiceThread.setHandlers(mHandler, connectedThread.getHandler());
connectedThread.start();
voiceThread.start();
}
ConnectedThread和VoiceRecognitionThread都扩展了HandlerThread。它们都创建了一个类级别的Handler来处理发送给这些线程的消息。 getHandler返回对这些处理程序的引用。
答案 0 :(得分:1)
只需使用HandlerThread并通过其处理程序对象将消息与消息一起提供:
HandlerThread thread1 = new HandlerThread("Thread Name");
thread1.start();
handler1 = new MyHandler(thread1.getLooper());
// pass message for thread 1
handler1.sendmessage()
// and same for threads 2 and 3
请注意,如果您计划线程长时间运行,那就更好了 解决方案是使用IntentService。
IntentService是服务,因此,不太容易受到影响 Android回收然后资源变低。