Handler เป็นนามธรรมไม่สามารถสร้างอินสแตนซ์ได้


97

ฉันกำลังพยายามใช้Handlerแอปในแอปของฉัน แต่เมื่อฉันยกตัวอย่างเช่นนี้:

Handler handler = new Handler();

ฉันได้รับข้อผิดพลาดต่อไปนี้

Gradle: error: Handler is abstract; cannot be instantiated

และเมื่อฉันตรวจสอบวิธีแก้ปัญหาก็ขอให้ฉันใช้วิธีเหล่านี้:

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

        }

        @Override
        public void flush() {

        }

        @Override
        public void publish(LogRecord record) {

        }
    };

ฉันไม่เคยใช้มาHandlersก่อนและฉันใช้มันเพื่อเรียกใช้เมธอดหลังจากล่าช้าไปบ้าง เพื่อให้บรรลุสิ่งนั้นฉันได้ใช้:

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

แต่แสดงข้อผิดพลาด:

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

กรุณาช่วย! ขอบคุณล่วงหน้า.

คำตอบ:


381

ดูเหมือนว่าคุณนำเข้าคลาส Handler ผิด

import java.util.logging.Handler;

เปลี่ยนเป็น

import android.os.Handler;

3
มันมีประโยชน์สำหรับฉันอย่างแน่นอน - ในฐานะนักพัฒนา iOS ที่กลับมาทำโครงการเป็นครั้งคราวสำหรับ Android Android Studio มีนิสัยแปลก ๆ ที่น่ารำคาญการพยายามที่จะฉลาดเกินไปในการนำเข้า / การเติมข้อความอัตโนมัติเป็นสิ่งหนึ่งที่เร็วกว่า 90% ของเวลาช้ากว่า 5 เท่า 10% ของเวลา ขอบคุณอีกครั้ง
Joel Balmer

1
@ Glenn-- srsly นี่เพิ่งแก้ไขข้อผิดพลาดอื่น ๆ ทั้งหมดในโค้ดของฉัน ++ คำตอบนี้!
Joel Balmer

อะไรคือความแตกต่างระหว่างทั้งสอง?
Krishnadas PC

มันยากที่จะเชื่อว่าพวกเขาจะใช้ชื่อคลาสที่กำหนดไว้แล้วใน java ...
Julius

5

ในสถานที่ของ

import java.util.logging.Handler; 

เพิ่ม

import android.os.Handler;

หากคุณใช้

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

    }

    @Override
    public void flush() {

    }

    @Override
    public void publish(LogRecord record) {

    }
};

มันจะให้ข้อผิดพลาดที่บูลีนพบบางอย่างเช่น error ดังนั้นให้ใช้ boolean handler = new Handler () ... หรือใช้ (new Handler ()) {.... `


2

Android SDK นำเข้าอัตโนมัติที่ไม่ถูกต้อง นั่นเป็นสาเหตุที่คนมีปัญหา


นี่เป็นเรื่องไร้สาระอย่างสมบูรณ์ในส่วนของ Android
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
ต้องการเพิ่มคำอธิบาย?
Onik

0

นำเข้า android.os.Handler; นี่คือตัวจัดการที่จำเป็นสำหรับตัวคุณเอง ก่อนนำเข้าคลาส Handler โปรดลองนำเข้าด้านบน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.