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();
Спасибо за ваше время, надеюсь, вы можете пролить свет на то, что я делаю неправильно.
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)
Ответы
Ответ 1
Я почти уверен, что это вызвано тем, что поток завершил свою работу, но активность больше не видна.
Вы должны проверить, не возвращается ли вызов 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();
Ответ 2
После нажатия назад фоновый поток все еще работает. К тому моменту, когда поток достигнет кода 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));
}
});
}
Ответ 3
Причиной NPE является то, что ваш поток не связан с жизненным циклом фрагмента. Как только фрагмент отсоединяется от его хостинговой активности, getActivity()
возвращает значение null.
В качестве решения рассмотрите возможность удаления потока в целом и просто используйте postDelayed()
в Handler
в потоке пользовательского интерфейса, чтобы отправить Runnable
, который делает обновления, которые вы хотите после задержки.
Ответ 4
Положите
if(getActivity() == null)
return;
до getActivity().runOnUiThread(new Runnable(){
таким образом, когда кнопка "Назад" закрыта, и ваш Thread
все еще работает, он будет проверять, существует ли еще вызов Activity
.
Если это не так, return
.
Ответ 5
Попробуйте этот
TextView date = (TextView) getView().findViewById(R.id.date);
- дата имеет значение null или не проверяет
if(date !=null){
date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR));
}