Der Handler ist abstrakt und kann nicht instanziiert werden


97

Ich versuche, eine Handlerin meiner App zu verwenden. Aber wenn ich es so instanziiere:

Handler handler = new Handler();

Ich erhalte den folgenden Fehler.

Gradle: error: Handler is abstract; cannot be instantiated

Und wenn ich die Lösungen überprüfe, werde ich aufgefordert, diese Methoden zu implementieren:

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

        }

        @Override
        public void flush() {

        }

        @Override
        public void publish(LogRecord record) {

        }
    };

Ich habe es noch nie benutzt Handlersund benutze es nur, um nach einiger Verzögerung eine Methode aufzurufen. Um dies zu erreichen, habe ich verwendet:

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

Aber es zeigt den Fehler:

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

Bitte helfen Sie! Danke im Voraus.

Antworten:


379

Anscheinend haben Sie eine falsche Handler-Klasse importiert

import java.util.logging.Handler;

Ändern Sie es in

import android.os.Handler;

3
Es war auf jeden Fall hilfreich für mich - als iOS-Entwickler, der gelegentlich zu Projekten für Android zurückkehrt, hat Android Studio einige nervige Macken. Der Versuch, beim Importieren / Autocompleting ZU klug zu sein, ist einer, dh in 90% der Fälle schneller, 5-mal langsamer 10% der Zeit.
Joel Balmer

1
@ Glenn--, srsly, dies hat gerade alle möglichen anderen Fehler in meinem Code gelöst. ++ auf diese Antwort!
Joel Balmer

Was ist der Unterschied zwischen beiden?
Krishnadas PC

Es ist schwer zu glauben, dass sie einen Klassennamen verwenden würden, der bereits in Java definiert ist ...
Julius

5

Anstelle von

import java.util.logging.Handler; 

hinzufügen

import android.os.Handler;

auch wenn du verwendest

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

    }

    @Override
    public void flush() {

    }

    @Override
    public void publish(LogRecord record) {

    }
};

es wird einen Fehler geben, dass boolean so etwas wie einen Fehler gefunden hat, also benutze entweder boolean handler = new Handler () ... oder benutze einfach (new Handler ()) {.... `


2

Das Android SDK importiert automatisch das falsche. Deshalb haben die Leute Probleme.


Dies ist völlig lächerlich von Android Seite
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
Möchten Sie eine Erklärung hinzufügen?
Onik

0

import android.os.Handler; Dies ist der Handler, der für Ihren Zweck benötigt wird. Versuchen Sie vor dem Importieren der Handler-Klasse, die oben genannten zu importieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.