2013-09-02 3 views
9

Я разрабатываю приложение для Android, которое заставляет ОС замораживать.Как приложение может заморозить ОС Android

Мой вопрос довольно прост, но после длительных поисков я подошел не ближе к ответу.

Вопрос в том, как приложение, изолированное от песочницы, заставляет замораживать все ОС Android (4.0.4, 4.1.1, 4.1.2)?

В частности, вся ОС замерзает. Никакой ловушки, никакого адда, ничего! Он так же заморожен, как и ОС. Это устройство Samsung Galaxy Tab 2. Приложение использует UsbManager и библиотеку от usb-serial-for-android project. Хотя библиотека может использовать NDK, мое приложение не работает. По сути, приложение обменивается информацией с приставкой, получая данные и отправляя последовательные команды. Это делается на рабочем потоке, который выбывает таким образом:

try { 

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

} catch (InterruptedException e) { 
     e.printStackTrace(); 
} 

Это все работает нормально, то есть до тех пор, замораживание не происходит - когда я отключаю USB-кабель или инструктировать объект библиотеки отключить. В любом случае, вся ОС становится нестабильной и немедленно замерзает или после подключения USB снова (плата или компьютер). Я опубликовал эту проблему с замораживанием в проекте usb-serial-for-android, но пока не получил никаких комментариев. Я считаю, что следую надлежащим протоколам при отключении USB.

Я понимаю, что многие вещи могут пойти не так - мое приложение может разрушить et. и др. Но опять же, как приложение с песочницей разбивает ОС - оно не кажется очень изолированным, если оно может это сделать.

UPDATE

У меня после долгих экспериментов установлены, что путь удаления thread.interrupt(); линии, что она работает без сбоев приложения или замораживаний ОС. Он по-прежнему замораживает ОС, если USB отключен от сети, не отключая его.

Я все еще хочу понять, как изолированное приложение может заморозить всю ОС. Здесь есть комментарии, которые ускользают от ответа, но не являются ответом в одиночку.

+1

замораживание, так как вы даже не можете вернуться домой, используя домашнюю кнопку? вы используете эмулятор или настоящее устройство? если вы использовали устройство, что это за устройство? если он подключен к компьютеру, что сказал логарифм? что происходит, что может вызвать замораживание? – Keale

+1

Много вещей. Вы должны быть более конкретными. –

+1

Я бы искал жесткую петлю с неудовлетворенными условиями завершения или поведение, такое как рекурсивный перезапуск.Поскольку вы * (конечно) * используете исходный контроль, откатываетесь до последней известной рабочей версии и делаете шаг вперед, чтобы найти, какие изменения вызывают проблему. – andy256

ответ

0

Ваш e-mail будет таким образом.

Он должен быть в потоке пользовательского интерфейса, потенциально блокируя взаимодействие пользователя.

Вы также получаете сообщение ANR перед замораживанием?

thread.join(); 

будет блокироваться на неопределенный срок. См. Thread.join() documentation.

Кроме того, следующее выглядит как занятый цикл для меня.

Что вы делаете в комментарии? Если ничего, тогда петля будет вращаться как сумасшедшая (думаю, while (true) { }).

while(thread.getState() != Thread.State.TERMINATED){ 
      // wait until thread finishes 
    } 
+0

Нет ANR только для замораживания ОС. Рабочие потоки используются для предотвращения блокировки пользовательского интерфейса. Как указано в сообщении, все работает нормально до тех пор, пока USB не будет отключен. –

+0

Простите, я пропустил ваше упоминание о Рабочем. Похоже, [destroy] (http://developer.android.com/reference/java/lang/Thread.html#destroy()) устарел. Я бы прокомментировал это. Также соединение может блокироваться, я бы предложил попробовать join (milli, nano); Также добавьте окончательный catch (Exception e) {как уловку и закомментируйте весь цикл while. – stackunderflow

+0

Я видел много сообщений, рекомендующих процесс завершения потока, который я использую, - вы не можете убить поток напрямую (вы можете, но это не рекомендуется), вы должны сказать, что он вам больше не нужен ('with join') и подождите - таким образом, цикл. Я протестировал это без использования библиотеки usb в сценарии с доказательством концепции, чтобы быть очень успешным. Не ждать в цикле до тех пор, пока нить не закончится, не рекомендуется, потому что уничтожение создаваемого объекта приводит к тому, что приложение становится очень неустойчивым и запутанным. –

Смежные вопросы