web-dev-qa-db-fra.com

NullPointerException sur getActivity (). RunOnUiThread (new Runnable () {

Je sais qu'il existe de nombreuses causes différentes pour NPE mais la mienne est légèrement bizarre (du moins pour moi).

J'ai donc converti mon Activities en Fragments avec succès, mais mon problème semble provenir de la fonction qui affiche la date. Lorsque l'application est en cours d'exécution, tout fonctionne très bien. Mais dès que vous appuyez sur le bouton de retour. La force de l'application se ferme, puis dans le journal, il est indiqué que je reçois NullPointerException à la ligne 102. Donc, en regardant le code, j'ai fait des recherches à ce sujet, mais malheureusement je n'ai rien obtenu.

Il s'agit de la ligne d'où provient l'erreur lorsque vous appuyez sur le bouton de retour.

getActivity().runOnUiThread(new Runnable(){

J'ai également essayé de désactiver le bouton de retour (car je construis un lanceur et ce n'est pas nécessaire). Mais cela ne semble pas fonctionner.

Voici le code de la méthode/fonction d'affichage de la date entière.

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

Merci pour votre temps, j'espère que vous pourrez faire la lumière sur ce que je fais mal.

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)
38
Robin

Je suis presque sûr que cela est causé lorsque le thread a terminé son travail, mais l'activité n'est plus visible.

Vous devez vérifier si l'appel getActivity() retourne null, et ...

Pour appliquer des corrections sur votre code, regardez ceci:

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

Après avoir appuyé en arrière, votre thread d'arrière-plan est toujours en cours d'exécution. Au moment où le thread atteint le code getActivity().runOnUiThread(), l'activité n'existe plus. Vérifiez si l'activité existe toujours comme ceci:

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));
            }
        });
}
17
Mark Pazon

Mettre

if(getActivity() == null)
        return;

avant getActivity().runOnUiThread(new Runnable(){ de cette façon, lorsque le bouton retour est fermé et que votre Thread est toujours en cours d'exécution, il vérifiera si l'appelant Activity existe toujours.

Si ce n'est pas le cas, ce sera return.

9
Apoorv

La raison du NPE est que votre thread n'est pas lié au cycle de vie du fragment. Une fois le fragment détaché de son activité d'hébergement, getActivity() renvoie null.

En tant que solution, envisagez de supprimer complètement le thread et utilisez simplement postDelayed() sur un Handler sur le thread d'interface utilisateur pour publier Runnables qui effectuent les mises à jour souhaitées après un certain délai.

8
laalto

Essaye celui-là

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

cette date est nulle ou non cochée

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