java - NullPointerException su getActivity (). RunOnUiThread (new Runnable () {




3 Answers

Sono quasi sicuro che questo è causato quando il thread finisce il suo lavoro ma l'attività non è più visibile.

È necessario verificare se la chiamata getActivity() restituisce null e ...

Per applicare correzioni sul tuo codice, guarda questo:

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

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)



Il motivo per NPE è che il thread non è associato al ciclo di vita del frammento. Una volta che il frammento viene rimosso dalla sua attività di hosting, getActivity() restituisce null.

Come soluzione, considera la possibilità di rimuovere completamente il thread e di utilizzare postDelayed() su un Handler sul thread dell'interfaccia utente per pubblicare i Runnable che eseguono gli aggiornamenti desiderati dopo un ritardo.




Prova questo

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

la data è nulla o non controlla

if(date !=null){
                    date.setText(DateUtils.formatDateTime(getActivity().getBaseContext(), System.currentTimeMillis(),DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR));
}



Related