Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.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
应用程序如何冻结Android操作系统_Android_Freeze - Fatal编程技术网

应用程序如何冻结Android操作系统

应用程序如何冻结Android操作系统,android,freeze,Android,Freeze,我正在开发一款Android应用程序,导致操作系统冻结 我的问题很简单,但经过长时间的搜索,我还没有找到答案 问题是,一个沙盒应用程序如何导致整个Android操作系统(4.0.4、4.1.1、4.1.2)冻结 具体来说,整个操作系统都冻结了。没有logcat,没有adb,什么都没有!它是一个操作系统可以得到的最冻结的。该设备是三星Galaxy Tab 2。该应用程序使用的是UsbManager和中的库。虽然库可能会使用NDK,但我的应用程序不会。从本质上讲,该应用程序与一个适当的板进行串行通信

我正在开发一款Android应用程序,导致操作系统冻结

我的问题很简单,但经过长时间的搜索,我还没有找到答案

问题是,一个沙盒应用程序如何导致整个Android操作系统(4.0.4、4.1.1、4.1.2)冻结

具体来说,整个操作系统都冻结了。没有logcat,没有adb,什么都没有!它是一个操作系统可以得到的最冻结的。该设备是三星Galaxy Tab 2。该应用程序使用的是
UsbManager
和中的库。虽然库可能会使用NDK,但我的应用程序不会。从本质上讲,该应用程序与一个适当的板进行串行通信,接收数据并发送串行命令。这是在工作线程上完成的,工作线程以以下方式处理:

try {

        thread.interrupt();
        thread.join();          
        while(thread.getState() != Thread.State.TERMINATED){
              // wait until thread finishes
        }

} catch (InterruptedException e) {
       e.printStackTrace();
}
一切正常,直到冻结发生——当我断开usb电缆或指示库对象断开连接时。无论哪种方式,整个操作系统都会变得不稳定,并会立即冻结或再次连接usb(板或计算机)。我已经将这个冻结问题发布到了android项目的usb序列号上,但还没有收到任何评论。我相信我在断开usb连接时遵循了正确的协议

我知道很多事情都可能出错——我的应用程序可能会崩溃等等。但是沙盒应用程序是如何使操作系统崩溃的呢?如果它能够做到这一点,那么它看起来并不是很沙盒化

更新

经过多次实验,我发现通过删除
thread.interrupt()行,它不会使应用程序崩溃或冻结操作系统。如果USB未先卸下就拔下,它仍然会冻结操作系统


我仍然希望了解沙盒应用程序如何冻结整个操作系统。这里有一些注释无法给出答案,但不是唯一的答案。

上面的代码示例在哪里

它应该位于UI线程上,可能会阻止用户交互

你在冻结前也收到消息了吗

    thread.join();
将无限期地阻止。看

此外,以下内容对我来说似乎是一个繁忙的循环

你在评论中做什么?如果没有,那么循环将疯狂地旋转(想想
while(true){}


别动,就像你不能用home按钮回家一样?您使用的是仿真器还是真实设备?如果你使用了一个设备,那是什么设备?如果它连接到计算机,logcat会说什么?会发生什么导致冰冻?很多事情。你必须更具体一些。我会寻找一个不满足终止条件的紧密循环,或者像递归重启自己这样的行为。由于您(当然)使用的是源代码管理,请回滚到上一个已知的工作版本,然后向前一步查找导致问题的更改。您也没有描述应用程序的功能。你是否在用C语言(NDK)的低级图形、声音或其他东西来解释你所看到的行为。应用程序会冻结Android是一个恼人的事实。大多数情况下是因为应用程序在UI线程中执行了太多操作,阻止了Androids对用户输入的反应。但你的情况似乎更进一步,也阻碍了logcat和adb。特别是这两个都是基于Linux服务的,所以你的应用程序应该不能做到这一点。对我们来说,为了能够提供帮助,你们必须进行更多的调查。我猜:串行USB库中的本机调用。这个库必须对传入的数据进行实时处理,而且可能会忘记给世界其他地方一个处理的机会。工作线程用于防止UI阻塞。正如在文章中所说,在usb断开连接之前,一切都正常。对不起,我错过了你提到的工人。看起来它已被弃用。我会把它评论出来。另外,join可以阻止,我建议尝试join(mili,nano);另外,将最后一个}catch(异常e){作为一个catch all并注释掉整个while循环。我看到许多帖子推荐我正在使用的线程终止过程-你不能直接终止线程(可以,但不建议),你必须告诉它你不再需要它(
with join
)等待-因此是循环。我已经在概念验证场景中测试了这个w/o usb库非常成功。不建议在循环中等待线程完成,因为破坏创建它的对象会导致应用程序变得非常不稳定和愚蠢。
    while(thread.getState() != Thread.State.TERMINATED){
          // wait until thread finishes
    }