NullPointerException в getActivity (). RunOnUiThread (новый Runnable () {

Я знаю, что для NPE существует много разных причин, но у меня немного странно (по крайней мере для меня).

Поэтому я успешно конвертировал свои Activities в Fragments , но моя проблема, похоже, исходит от функции, отображающей дату. Когда приложение работает, все работает нормально. Но как только вы нажмете кнопку «Назад». Сила приложения закрывается, затем в журнале говорится, что я получаю NullPointerException в строке 102. Так что, глядя на код, я занимался этим, но, к сожалению, ничего не получил.

Это строка, в которой происходит ошибка при нажатии кнопки «Назад».

 getActivity().runOnUiThread(new Runnable(){ 

Также я попытался отключить кнопку «Назад» (поскольку я создаю пусковую установку и не нужен). Но, похоже, это не работает.

Вот код для всего метода отображения даты / функции.

 // (Calendar) Date function - Displays dateview on Card final boolean keepRunning1 = true; Thread thread_two = new Thread(){ @Override public void run(){ while(keepRunning1){ // Make the thread wait half a second. If you want... try { Thread.sleep(500); } catch (InterruptedException e) { Toast.makeText(getActivity().getApplicationContext(), "Default Signature Fail", Toast.LENGTH_LONG).show(); e.printStackTrace(); } getActivity().runOnUiThread(new Runnable(){ @Override public void run(){ TextView date = (TextView) getView().findViewById(R.id.date); date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR)); } }); } } }; thread_two.start(); в // (Calendar) Date function - Displays dateview on Card final boolean keepRunning1 = true; Thread thread_two = new Thread(){ @Override public void run(){ while(keepRunning1){ // Make the thread wait half a second. If you want... try { Thread.sleep(500); } catch (InterruptedException e) { Toast.makeText(getActivity().getApplicationContext(), "Default Signature Fail", Toast.LENGTH_LONG).show(); e.printStackTrace(); } getActivity().runOnUiThread(new Runnable(){ @Override public void run(){ TextView date = (TextView) getView().findViewById(R.id.date); date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR)); } }); } } }; thread_two.start(); 

Спасибо за ваше время, надеюсь, вы можете пролить свет на то, что я делаю неправильно.

Logcat –

 05-23 21:17:33.216: E/AndroidRuntime(6906): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.app.FragmentActivity.runOnUiThread(java.lang.Runnable)' on a null object reference 05-23 21:17:33.216: E/AndroidRuntime(6906): at com.activelauncher.fragments.UtilsFragment$2.run(UtilsFragment.java:102) 

Я почти уверен, что это вызвано тем, что поток завершил свою работу, но активность больше не видна.

Вы должны проверить, getActivity() вызов getActivity() null , и …

Чтобы применить исправления к вашему коду, посмотрите на это:

 // (Calendar) Date function - Displays dateview on Card final boolean keepRunning1 = true; Thread thread_two = new Thread(){ @Override public void run(){ while(keepRunning1){ // Make the thread wait half a second. If you want... try { Thread.sleep(500); } catch (InterruptedException e) { Toast.makeText(getActivity().getApplicationContext(), "Default Signature Fail", Toast.LENGTH_LONG).show(); e.printStackTrace(); } // here you check the value of getActivity() and break up if needed if(getActivity() == null) return; getActivity().runOnUiThread(new Runnable(){ @Override public void run(){ TextView date = (TextView) getView().findViewById(R.id.date); date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR)); } }); } } };thread_two.start(); в // (Calendar) Date function - Displays dateview on Card final boolean keepRunning1 = true; Thread thread_two = new Thread(){ @Override public void run(){ while(keepRunning1){ // Make the thread wait half a second. If you want... try { Thread.sleep(500); } catch (InterruptedException e) { Toast.makeText(getActivity().getApplicationContext(), "Default Signature Fail", Toast.LENGTH_LONG).show(); e.printStackTrace(); } // here you check the value of getActivity() and break up if needed if(getActivity() == null) return; getActivity().runOnUiThread(new Runnable(){ @Override public void run(){ TextView date = (TextView) getView().findViewById(R.id.date); date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR)); } }); } } };thread_two.start(); 

После нажатия назад фоновый поток все еще работает. К тому моменту, когда поток достигнет getActivityrunOnUiThread() , эта активность больше не существует. Убедитесь, что активность все еще существует.

 if (getActivity()!=null) { getActivity().runOnUiThread(new Runnable(){ @Override public void run(){ TextView date = (TextView) getView().findViewById(R.id.date); date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR)); } }); } 

Причиной NPE является то, что ваш поток не связан с жизненным циклом фрагмента. После того как фрагмент отсоединен от своей активности хостинга, getActivity() возвращает значение null.

В качестве решения рассмотрите возможность удаления потока в целом и просто используйте postDelayed() для Handler в потоке пользовательского интерфейса, чтобы отправить Runnable s, который делает обновления, которые вы хотите после задержки.

Положил

 if(getActivity() == null) return; 

Перед getActivity().runOnUiThread(new Runnable(){ таким образом, когда кнопка «Назад» закрыта, и ваш Thread все еще запущен, он проверяет, все еще существует вызывающая Activity .

Если это не так, он return .

Попробуй это

 TextView date = (TextView) getView().findViewById(R.id.date); 

Дата недействительна или не проверяется

 if(date !=null){ date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR)); } 
Intereting Posts
Мое приложение недоступно для планшетного устройства в Google Play FacebookSdk.sdkInitialize (Контекст) устарел Перенаправление веб-просмотра Android с помощью фильтра намерений Android C2DM: Дублировать сообщение на одно и то же устройство и приложение Обнаружить установленный сертификат в моем устройстве Android «Преобразование в формат Dalvik с ошибкой 1» на внешнем JAR Android-версия 1.3 Multiidex ошибка в градиенте Почему я получаю исключение null-указателя из TabWidget? Как получить видео с камеры Intent и сохранить ее в каталоге? Как бы я установил ImageButton для изменения только тогда, когда мой палец касался его Как захватить событие «виртуальная клавиатура show / hide» в Android? SetCloseButtonIcon () не меняет кнопку закрытия по умолчанию Тяжесть TextView не работает с ивритом Обнулить слушателя во Фрагменте onDetach ()? Ошибка: несовместимые типы: GsonConverterFactory не может быть преобразован в Factory