हैंडलर बंद करो। पोस्टडायलैड ()


109

मैं नए हैंडलर () द्वारा कई हैंडलर को पोस्ट करता हूं। पोस्टडेलिड (नया रननेबल) (..... जब मैं वापस क्लिक करता हूं तो मैं इसे कैसे रोक सकता हूं?

public class MyActivity extends AppCompatActivity implements OnClickListener {

    private Button btn;
    private Handler handler;
    private Runnable myRunnable;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 
        btn = (Button) findViewById(R.id.trainingsstart);
        btn.setOnClickListener(this);   
    }

    @Override
    public void onClick(View v) {
        Handler handler =  new Handler();
        Runnable myRunnable = new Runnable() {
            public void run() {
                // Things to be done
            }
        };

        handler.postDelayed(myRunnable, 3000);
    }

    @Override 
    public void onBackPressed() { 
        super.onBackPressed();
        handler.removeCallbacks(myRunnable);
    }   
}

मुझे समस्या है कि मेरे हैंडलर का नाम "myHandler" नहीं है। मैं इसे कैसे संभाल सकता हूं?

सहायता के लिए धन्यवाद!

अब मुझे ये त्रुटि मिली:

03-28 17:47:03.662: E/AndroidRuntime(1961): FATAL EXCEPTION: main
03-28 17:47:03.662: E/AndroidRuntime(1961): java.lang.NullPointerException
03-28 17:47:03.662: E/AndroidRuntime(1961):     at de.basti12354.tage.uebungen.Tag1.onBackPressed(Tag1.java:120)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.app.Activity.onKeyUp(Activity.java:2159)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.KeyEvent.dispatch(KeyEvent.java:2647)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.app.Activity.dispatchKeyEvent(Activity.java:2389)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1860)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3791)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3774)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3483)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3540)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3406)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3379)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3429)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3398)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3516)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3666)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:1982)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1698)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1689)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:1959)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.os.MessageQueue.nativePollOnce(Native Method)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.os.MessageQueue.next(MessageQueue.java:132)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.os.Looper.loop(Looper.java:124)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at android.app.ActivityThread.main(ActivityThread.java:5103)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at java.lang.reflect.Method.invokeNative(Native Method)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at java.lang.reflect.Method.invoke(Method.java:525)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-28 17:47:03.662: E/AndroidRuntime(1961):     at dalvik.system.NativeStart.main(Native Method)

जवाबों:


197

आप उपयोग कर सकते हैं:

 Handler handler = new Handler()
 handler.postDelayed(new Runnable())

या आप उपयोग कर सकते हैं:

 handler.removeCallbacksAndMessages(null);

डॉक्स

सार्वजनिक अंतिम शून्य निष्कासन

एपीआई स्तर 1 में जोड़ा गया कॉलबैक के किसी भी लंबित पोस्ट को हटा दें और ऐसे संदेश भेजें जिनके ओबके टोकन हैं। यदि टोकन शून्य है, तो सभी कॉलबैक और संदेश हटा दिए जाएंगे।

या आप निम्न कार्य भी कर सकते हैं:

Handler handler =  new Handler()
Runnable myRunnable = new Runnable() {
public void run() {
    // do something
}
};
handler.postDelayed(myRunnable,zeit_dauer2);

फिर:

handler.removeCallbacks(myRunnable);

डॉक्स

सार्वजनिक अंतिम शून्य निष्कासन

एपीआई स्तर 1 में जोड़ा गया कि रनने योग्य आर के किसी भी लंबित पदों को हटा दें जो संदेश कतार में हैं।

सार्वजनिक अंतिम शून्य निष्कासन वापसी (रन करने योग्य आर, ऑब्जेक्ट टोकन)

संपादित करें:

इसे बदलो:

@Override
public void onClick(View v) {
    Handler handler =  new Handler();
    Runnable myRunnable = new Runnable() {

सेवा:

@Override
public void onClick(View v) {
    handler = new Handler();
    myRunnable = new Runnable() { /* ... */}

क्योंकि आपके पास नीचे है। पहले घोषित किया गया onCreateलेकिन आपने फिर से घोषित किया और फिर इसे onClickएनपीई के लिए अग्रणी बनाया।

Handler handler; // declared before onCreate
Runnable myRunnable;

1
हैंडलर जोड़ें ।removeCallbacks (myRunnable); मेरे onBackPressed () क्या यह सही है?
basti12354

1
@ user3433232 इसका उपयोग आप रन को रोकना चाहते हैं
रघुनंदन

1
क्या आप कृपया मेरे कोड को देख सकते हैं, मैं आपकी सहायता का उपयोग करने का प्रयास करता हूं, लेकिन अब मुझे त्रुटियां मिल गई हैं, आप मेरी पोस्ट पर देख सकते हैं।
basti12354

1
@ user3433232 संपादन की जाँच करें। आपका हैंडलर शून्य था। आपने इसे फिर से शुरू किया, जो एनपीई पर चला गया
रघुनंदन

6
मैं एपीआई 16 पर काम कर रहा हूं और handler.removeCallbacks (runnable) काम नहीं करता है। लेकिन हैंडलर .removeCallbacksAndMessages (अशक्त); धन्यवाद काम
mismanc

12

आप एक बूलियन को परिभाषित कर सकते हैं और इसे तब बदल सकते हैं जब आप हैंडलर को रोकना चाहते हैं। ऐशे ही..

boolean stop = false;

handler.postDelayed(new Runnable() {
    @Override
    public void run() {

        //do your work here..

        if (!stop) {
            handler.postDelayed(this, delay);
        }
    }
}, delay);

10

यह पुराना हो सकता है, लेकिन उत्तर की तलाश करने वालों के लिए आप इसका उपयोग कर सकते हैं ...

public void stopHandler() {
   handler.removeMessages(0);
}

चियर्स


2
  Boolean condition=false;  //Instance variable declaration.

 //-----------------Inside oncreate--------------------------------------------------- 
  start =(Button)findViewById(R.id.id_start);
        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                starthandler();

                if(condition=true)
                {
                    condition=false;
                }


            }
        });

        stop=(Button) findViewById(R.id.id_stoplocatingsmartplug);

        stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                stophandler();

            }
        });


    }

//-----------------Inside oncreate---------------------------------------------------

 public void starthandler()
    {

        handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {


                if(!condition)
                {
                    //Do something after 100ms 


                }

            }
        }, 5000);

    }


    public void stophandler()
    {
        condition=true;
    }

कृपया बताएं कि यह कोड कोड प्रश्न का उत्तर क्यों देता है।
एंड्रे कूल

मान लें कि XML प्रारंभ और रोकें में 2 बटन हैं। यह कोड डेमो दिखाता है कि हैंडलर को कैसे स्टार्ट बटन पर क्लिक किया जा सकता है और स्टॉप बटन द्वारा रोका जा सकता है।
विनय शेट्टी

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