Что происходит с потоками и представлениями активности при его уничтожении?

У меня есть активность, которая может иметь потоки, когда пользователь нажимает назад и заканчивает () действие. Что происходит с этими потоками в этот момент? Будут ли все попытки завершить, если я не прерву их в onDestroy ()?

Например, приведенный ниже код небезопасен, потому что мои представления и курсор могут быть уничтожены, если активность заканчивается перед потоком?

Причина, по которой я спрашиваю, заключается в том, что у меня случаются сбои при завершении действий, которые я еще не отлаживал, потому что они случаются редко и никогда, пока я не был в режиме отладки. С тех пор я начал проверять, являются ли мои объекты представления нулевыми, прежде чем что-либо делать с ними в runOnUIThread (). Не уверен, что это самое чистое решение, или если это проблема вообще.

new Thread()( public void run(){ crunchOnSomethingForAwhile(mCursor); MyActivity.this.runOnUIThread(new Runnable(){ public void run(){ mTextView.setText("thread complete"); mCursor.close(); } } } ).start(); 

Я бы посмотрел на использование AsyncTask вместо простого Thread . У него есть встроенная поддержка для работы в другом потоке, а затем после завершения что-то сделать в потоке пользовательского интерфейса.

Тем не менее, вокруг этого разговора есть ряд тем о том, как обращаться с AsyncTask s, когда действие завершается. То, что вы должны делать, зависит от того, что делает задача. Если это применимо только к этой Деятельности, вы можете просто отменить задачу в onPause (при условии, что это не просто изменение вращения).

В противном случае существуют различные тактики, позволяющие удерживать AsyncTasks через действия. См. Этот вопрос для некоторых идей. В этом блоге commonsware также есть пример использования AsyncTask во время поворота экрана.

Кто-то отправил ответ на другой поток, который onDestroy устанавливает все ссылки на ссылки на null и, наконец, ссылку на действие null. Поэтому я буду считать, что лучше всего прервать все запущенные потоки в onDestroy или, по крайней мере, уловить NullPointerExceptions в любых методах runInUIThread.