Handler is abstract ,cannot be instantiated
Asked Answered
K

6

97

I am trying to use a Handler in my app. However, when I instantiate it like this:

Handler handler = new Handler();

I get the following error:

Gradle: error: Handler is abstract; cannot be instantiated

And when I check the solutions, it asks me to implement these methods:

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

    @Override
    public void flush() {

    }

    @Override
    public void publish(LogRecord record) {

    }
};

I have never used Handlers before and I am using it just to call a method after some delay. To achieve that, I've used:

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

But it shows the error:

Gradle: error: cannot find symbol method postDelayed(,int)

Killer answered 9/11, 2013 at 6:20 Comment(0)
R
398

It seems you have imported a wrong Handler class

import java.util.logging.Handler;

Change it to

import android.os.Handler;
Rightward answered 9/11, 2013 at 6:25 Comment(4)
It certainly was helpful to me - as an iOS developer coming back to occasional projects for Android, Android Studio has some annoying quirks, trying to be TOO clever at importing/autocompleting is one i.e. is quicker 90% of the time, is 5 x slower 10% of the time. Thanks againEiger
@Glenn--, srsly, this just solved all manner of other errors in my code. ++ to this answer!Eiger
What is difference between both of them?Flatfoot
It's hard to believe they would use a classname that's already defined in java...Exocarp
G
5

In Place Of

import java.util.logging.Handler; 

add

import android.os.Handler;

also if you use

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

    }

    @Override
    public void flush() {

    }

    @Override
    public void publish(LogRecord record) {

    }
};

it will give error that boolean found somthing like error so either use boolean handler = new Handler()... or simply use (new Handler()){....`

Gamo answered 25/2, 2016 at 9:35 Comment(0)
S
2

Android SDK auto imports the incorrect one. That's why people have problems.

Shammy answered 12/8, 2017 at 1:51 Comment(1)
This is completely ridiculous on android's partExocarp
M
2

It seems like you have implemented the wrong Handler class

import java.util.logging.Handler;

Change it to

import android.os.Handler;

Mannequin answered 28/8, 2020 at 15:27 Comment(0)
P
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();
        };
    }
}
Peculiarize answered 31/1, 2015 at 19:52 Comment(1)
Care to add some explanation?Fadeout
B
0

import android.os.Handler; this the handler needed for your purpous. Before importing the Handler class please try to import the above.

Boule answered 15/5, 2017 at 11:49 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.