El controlador es abstracto, no se puede crear una instancia

97

Estoy intentando usar un Handleren mi aplicación. Pero cuando lo instalo así:

Handler handler = new Handler();

Obtuve el siguiente error.

Gradle: error: Handler is abstract; cannot be instantiated

Y cuando verifico las soluciones, me pide que implemente estos métodos:

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

        }

        @Override
        public void flush() {

        }

        @Override
        public void publish(LogRecord record) {

        }
    };

Nunca lo he usado Handlersantes y lo estoy usando solo para llamar a un método después de un retraso. Para lograr eso, he usado:

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

Pero muestra el error:

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

¡Por favor ayuda! Gracias por adelantado.

Chinmay Dabke
fuente

Respuestas:

379

Parece que ha importado una clase de controlador incorrecta

import java.util.logging.Handler;

Cámbielo a

import android.os.Handler;
Glenn
fuente
3
Ciertamente fue útil para mí: como desarrollador de iOS que regresa a proyectos ocasionales para Android, Android Studio tiene algunas peculiaridades molestas, tratar de ser DEMASIADO inteligente en la importación / autocompletar es uno, es decir, es más rápido el 90% del tiempo, es 5 veces más lento 10% del tiempo. Gracias de nuevo
Joel Balmer
1
@ Glenn--, srsly, esto acaba de resolver todo tipo de errores en mi código. ++ a esta respuesta!
Joel Balmer
¿Cuál es la diferencia entre ambos?
Krishnadas PC
Es difícil de creer que usarían un nombre de clase que ya está definido en java ...
Julio
5

En lugar de

import java.util.logging.Handler; 

añadir

import android.os.Handler;

también si usas

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

    }

    @Override
    public void flush() {

    }

    @Override
    public void publish(LogRecord record) {

    }
};

dará un error que boolean encontró algo así como un error, así que use boolean handler = new Handler () ... o simplemente use (new Handler ()) {.... `

Anand Saurabh
fuente
2

Android SDK importa automáticamente el incorrecto. Por eso la gente tiene problemas.

SPC700
fuente
Esto es completamente ridículo por parte de Android
Julio
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
fuente
1
¿Le importaría agregar alguna explicación?
Onik
0

importar android.os.Handler; este es el controlador necesario para su propósito. Antes de importar la clase Handler, intente importar lo anterior.

Sujith Ks
fuente