[java] NullPointerException su getActivity (). RunOnUiThread (new Runnable () {


Answers

Dopo aver premuto indietro, il thread in background è ancora in esecuzione. Quando quel thread raggiunge il codice getActivityrunOnUiThread() , l'attività non esiste più. Controlla se l'attività esiste ancora mi piace:

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));
            }
        });
}
Question

Questa domanda ha già una risposta qui:

So che ci sono molte cause diverse per NPE ma il mio è un po 'strano (almeno per me).

Quindi ho convertito correttamente le mie Activities in Fragments , ma il mio problema sembra provenire dalla funzione che mostra la data. Quando l'applicazione è in esecuzione, tutto funziona perfettamente. Ma non appena premi il pulsante Indietro. La forza dell'app si chiude, quindi nel log si dice che sto ricevendo NullPointerException alla riga 102. Quindi, guardando il codice, ho fatto delle ricerche su questo, ma sfortunatamente non ho ottenuto nulla.

Questa è la linea da cui proviene l'errore quando premi il pulsante Indietro.

getActivity().runOnUiThread(new Runnable(){

Inoltre ho provato a disabilitare il pulsante Indietro (come sto costruendo un launcher e non è necessario). Ma non sembra funzionare.

Ecco il codice per l'intera modalità di visualizzazione della data / funzione.

// (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();

Grazie per il tuo tempo, si spera che tu possa fare luce su quello che sto facendo male.

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)



Mettere

if(getActivity() == null)
        return;

prima di getActivity().runOnUiThread(new Runnable(){ questo modo quando il pulsante Indietro è chiuso e il Thread è ancora in esecuzione, controllerà se l' Activity chiamante esiste ancora.

Se non lo farà return .




Related