Le gestionnaire est abstrait, ne peut pas être instancié


97

J'essaye d'utiliser un Handlerdans mon application. Mais quand je l'instancie comme ceci:

Handler handler = new Handler();

J'obtiens l'erreur suivante.

Gradle: error: Handler is abstract; cannot be instantiated

Et quand je vérifie les solutions, il me demande de mettre en œuvre ces méthodes:

Handler handler = new Handler() {
        @Override
        public void close() {

        }

        @Override
        public void flush() {

        }

        @Override
        public void publish(LogRecord record) {

        }
    };

Je ne l'ai jamais utilisé Handlersauparavant et je l'utilise juste pour appeler une méthode après un certain délai. Pour y parvenir, j'ai utilisé:

handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                //Do something after 100ms
            }
        }, 100);

Mais cela montre l'erreur:

Gradle: error: cannot find symbol method postDelayed(<anonymous Runnable>,int)

Veuillez aider! Merci d'avance.

Réponses:


379

Il semble que vous ayez importé une mauvaise classe de gestionnaire

import java.util.logging.Handler;

Changez-le en

import android.os.Handler;

3
Cela m'a certainement été utile - en tant que développeur iOS revenant sur des projets occasionnels pour Android, Android Studio a des bizarreries ennuyeuses, essayer d'être TROP intelligent pour l'importation / la saisie semi-automatique en est un, c'est-à-dire est plus rapide 90% du temps, est 5 fois plus lent 10% du temps. Merci encore
Joel Balmer

1
@ Glenn--, srsly, cela vient de résoudre toutes sortes d'autres erreurs dans mon code. ++ à cette réponse!
Joel Balmer

Quelle est la différence entre les deux?
PC de Krishnadas

Il est difficile de croire qu'ils utiliseraient un nom de classe déjà défini en java ...
Julius

5

Au lieu de

import java.util.logging.Handler; 

ajouter

import android.os.Handler;

aussi si vous utilisez

Handler handler = new Handler() {
    @Override
    public void close() {

    }

    @Override
    public void flush() {

    }

    @Override
    public void publish(LogRecord record) {

    }
};

cela donnera une erreur que boolean a trouvé quelque chose comme une erreur, alors utilisez boolean handler = new Handler () ... ou utilisez simplement (new Handler ()) {.... `


2

Le SDK Android importe automatiquement le mauvais. C'est pourquoi les gens ont des problèmes.


C'est complètement ridicule de la part d'Android
Julius

1
    import android.os.Bundle;
    import android.os.Handler;
    import android.support.v7.app.ActionBarActivity;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;

public class ActionActivity extends ActionBarActivity {

    final String LOG_TAG = "myLogs";
    TextView tvInfo;
    Button btnStart;
    Handler h;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.action_activity);
        tvInfo = (TextView)findViewById(R.id.tvinfo);
        btnStart = (Button)findViewById(R.id.btnstart);

        h = new Handler() {
            public void handleMessage(android.os.Message msg) {
                // update TextView
                tvInfo.setText("Закачано файлов: " + msg.what);
                if (msg.what == 10) btnStart.setEnabled(true);
            };
        };

    }

    public void onclick(View v) {
        switch (v.getId()) {
            case R.id.btnstart:
                btnStart.setEnabled(false);
                Thread t = new Thread(new Runnable() {
                    public void run() {
                        for (int i = 1; i <= 10; i++) {
                            // some process
                            downloadFile();
                            h.sendEmptyMessage(i);

                            Log.d(LOG_TAG, "i = " + i);
                        }
                    }
                });
                t.start();
                break;
            case R.id.btnTets:
                Log.d(LOG_TAG, "test");
                break;
            default:
                break;
        }
    }

    public void downloadFile(){
        try{
            TimeUnit.SECONDS.sleep(1);
        }
        catch (InterruptedException e){
                e.printStackTrace();
        };
    }
}

1
Voulez-vous ajouter quelques explications?
Onik

0

import android.os.Handler; c'est le gestionnaire nécessaire à votre purpous. Avant d'importer la classe Handler, veuillez essayer d'importer ce qui précède.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.