Подтвердить что ты не робот

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)
4b9b3361

Ответ 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));
}