핸들러는 추상적이며 인스턴스화 할 수 없습니다.


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)

도와주세요! 미리 감사드립니다.

답변:


379

잘못된 핸들러 클래스를 가져온 것 같습니다.

import java.util.logging.Handler;

다음으로 변경

import android.os.Handler;

3
그것은 확실히 저에게 도움이되었습니다. iOS 개발자가 가끔 Android 용 프로젝트로 돌아 오는 것처럼 Android Studio는 가져 오기 / 자동 완성에 너무 영리 해 지려고하는 몇 가지 성가신 단점이 있습니다. 즉, 90 % 더 빠르며 5 배 더 느립니다. 시간의 10 %. 다시 한 번 감사드립니다
Joel Balmer 2014 년

1
@ Glenn--, srsly, 이것은 내 코드의 다른 모든 오류를 해결했습니다. ++이 답변에!
Joel Balmer 2014 년

둘 다의 차이점은 무엇입니까?
Krishnadas PC

자바에 이미 정의 된 클래스 이름을 사용한다고 믿기 어렵습니다 ...
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) {

    }
};

boolean이 error와 같은 것을 발견했다는 오류가 발생하므로 boolean handler = new Handler () ...를 사용하거나 단순히 (new Handler ()) {....`를 사용하십시오.


2

Android SDK는 잘못된 것을 자동으로 가져옵니다. 그래서 사람들은 문제가 있습니다.


이것은 안드로이드 부분에서 완전히 우스꽝 스럽습니다
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 2015

0

import android.os.Handler; 이것은 당신의 자줏빛에 필요한 핸들러입니다. Handler 클래스를 가져 오기 전에 위의 가져 오기를 시도하십시오.


0

잘못된 Handler 클래스를 구현 한 것 같습니다.

import java.util.logging.Handler;

다음으로 변경

import android.os.Handler;

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.