Xử lý là trừu tượng, không thể được khởi tạo


97

Tôi đang cố gắng sử dụng một Handlertrong ứng dụng của mình. Nhưng khi tôi khởi tạo nó như thế này:

Handler handler = new Handler();

Tôi nhận được lỗi sau đây.

Gradle: error: Handler is abstract; cannot be instantiated

Và khi tôi kiểm tra các giải pháp, nó yêu cầu tôi thực hiện các phương pháp sau:

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

        }

        @Override
        public void flush() {

        }

        @Override
        public void publish(LogRecord record) {

        }
    };

Tôi chưa bao giờ sử dụng Handlerstrước đây và tôi đang sử dụng nó chỉ để gọi một phương thức sau một thời gian trì hoãn. Để đạt được điều đó, tôi đã sử dụng:

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

Nhưng nó hiển thị lỗi:

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

Xin vui lòng giúp đỡ! Cảm ơn trước.

Câu trả lời:


379

Có vẻ như bạn đã nhập sai lớp Trình xử lý

import java.util.logging.Handler;

Thay đổi nó thành

import android.os.Handler;

3
Nó chắc chắn hữu ích đối với tôi - với tư cách là một nhà phát triển iOS thỉnh thoảng quay lại với các dự án cho Android, Android Studio có một số vấn đề khó chịu, cố gắng QUÁ thông minh trong việc nhập / tự động hoàn thành tức là nhanh hơn 90% thời gian, chậm hơn 5 lần 10% thời gian. Cảm ơn một lần nữa
Joel Balmer.

1
@ Glenn--, thưa cô, điều này vừa giải quyết được tất cả các lỗi khác trong mã của tôi. ++ cho câu trả lời này!
Joel Balmer

Sự khác biệt giữa cả hai là gì?
Krishnadas PC

Thật khó để tin rằng họ sẽ sử dụng một tên lớp đã được xác định trong java ...
Julius

5

Thay cho

import java.util.logging.Handler; 

thêm vào

import android.os.Handler;

nếu bạn sử dụng

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

    }

    @Override
    public void flush() {

    }

    @Override
    public void publish(LogRecord record) {

    }
};

nó sẽ đưa ra lỗi mà boolean tìm thấy giống như lỗi vì vậy hoặc sử dụng boolean handler = new Handler () ... hoặc chỉ cần sử dụng (new Handler ()) {.... '


2

Android SDK tự động nhập không chính xác. Đó là lý do tại sao mọi người có vấn đề.


Đây là hoàn toàn vô lý trên phần android của
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
Muốn thêm một số lời giải thích?
Onik

0

nhập android.os.Handler; đây là trình xử lý cần thiết cho mục đích của bạn. Trước khi nhập lớp Trình xử lý, hãy thử nhập lớp ở trên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.