Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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 调试冻结的Android应用程序_Java_Android_Debugging - Fatal编程技术网

Java 调试冻结的Android应用程序

Java 调试冻结的Android应用程序,java,android,debugging,Java,Android,Debugging,我有一个Android应用程序,有三个线程,主线程和两个工作线程。线程需要定期相互通信 我最初是以一种可怕的方式做这件事的,这里的每个人都会因为我而对我大喊大叫。我在每个线程中保存了该线程的实例,并在线程需要该功能时从其他线程调用该类的方法。它起作用了,但我知道它不对 由于这是错误的,我返回并将线程的每个实例更改为线程处理程序的实例,并将每个线程函数调用替换为handler.sendMessage调用 现在这个程序不起作用了。它只是冻结了,我不知道发生了什么。当使用debug透视图时,我一步一步

我有一个Android应用程序,有三个线程,主线程和两个工作线程。线程需要定期相互通信

我最初是以一种可怕的方式做这件事的,这里的每个人都会因为我而对我大喊大叫。我在每个线程中保存了该线程的实例,并在线程需要该功能时从其他线程调用该类的方法。它起作用了,但我知道它不对

由于这是错误的,我返回并将线程的每个实例更改为线程处理程序的实例,并将每个线程函数调用替换为handler.sendMessage调用

现在这个程序不起作用了。它只是冻结了,我不知道发生了什么。当使用debug透视图时,我一步一步地浏览主线程,但得到的只是函数

boolean hasMessages(Handler h, int what, Object object)
{
...
}
从消息队列。其他线程在其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。它们都创建了一个类级处理程序,用于处理发送到这些线程的消息。getHandler返回对这些处理程序的引用。

只需使用一个,并通过其处理程序对象向其提供消息:

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是一种服务,因此,受影响的程度要小得多
Android回收然后资源就会变少。

你有备份吗?@MatiCicero我有备份,但由于代码违反惯例,我宁愿解决这个问题,而不是回到正常工作但不正确的状态version@323go我确实有代码,但它相当庞大,我不想在这里发布。我更希望在调试过程中得到一些帮助,而不是我的问题的答案。请将代码检查到版本控制中,然后尽可能减少代码以获得基本信息。最有可能的是,你会发现你的问题就在那里。如果没有,你可以发布它。除此之外。。。大量的
Log.d
s,别忘了断点。最后我发现它是一个带有断点的打字错误。我仍然不明白为什么它会让我的UI线程挂起,但我会接受它。感谢你的回答Gilad,我避免使用Service或IntentService,因为它们似乎按照主线程给它们工作的原则工作,它们完成工作,然后返回答案。对于我的应用程序,我需要一个线程轮询蓝牙缓冲区,另一个线程监听语音命令并在发出语音命令时执行操作。除了开始,他们不会从UI线程收到任何工作请求