调试冻结的Android应用程序

时间:2014-06-26 19:18:19

标签: java android debugging

我有一个包含三个线程的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返回对这些处理程序的引用。

1 个答案:

答案 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回收然后资源变低。