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.

Chinmay Dabke
quelle

Antworten:

379

Anscheinend haben Sie eine falsche Handler-Klasse importiert

import java.util.logging.Handler;

Ändern Sie es in

import android.os.Handler;
Glenn
quelle
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 ()) {.... `

Anand Saurabh
quelle
2

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

SPC700
quelle
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();
        };
    }
}
Vahe Gharibyan
quelle
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.

Sujith Ks
quelle