हैंडलर सार है, तुरंत नहीं किया जा सकता है


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 डेवलपर के रूप में जो एंड्रॉइड के लिए कभी-कभार परियोजनाओं पर वापस आ रहा है, एंड्रॉइड स्टूडियो में कुछ कष्टप्रद झगड़े हैं, आयात करने के लिए बहुत चालाक होने की कोशिश कर रहा है / ऑटोकोम्पलिंग एक है अर्थात समय का 90% तेज है, 5 x धीमा है समय का 10%। धन्यवाद फिर से
जोएल बामर

1
@ ग्लेन--, शायद ही, यह मेरे कोड में अन्य त्रुटियों के सभी तरीके को हल करता है। ++ इस जवाब के लिए!
जोएल बामर

दोनों में क्या अंतर है?
कृष्णदास पीसी

यह विश्वास करना मुश्किल है कि वे एक क्लासनाम का उपयोग करेंगे जो पहले से ही जावा में परिभाषित किया गया है ...
जूलियस

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) {

    }
};

यह त्रुटि देगा कि बूलियन त्रुटि की तरह पाया गया है या तो बूलियन हैंडलर = नए हैंडलर () का उपयोग करें ... या बस (नए हैंडलर ()) {.... `का उपयोग करें


2

Android SDK ऑटो गलत आयात करता है। इसलिए लोगों को समस्या होती है।


यह एंड्रॉइड के हिस्से पर पूरी तरह से हास्यास्पद है
जूलियस

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
कुछ स्पष्टीकरण जोड़ने के लिए देखभाल?
ओनिक

0

आयात android.os.Handler; यह हैंडलर आपके पर्स के लिए आवश्यक है। हैंडलर वर्ग आयात करने से पहले कृपया उपरोक्त आयात करने का प्रयास करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.