একটি হ্যান্ডেল.পোস্টডলেড প্রক্রিয়া বাতিল করা হচ্ছে


259

handler.postDelayed()আমার অ্যাপ্লিকেশনটির পরবর্তী পর্যায়ে আসার আগে আমি একটি অপেক্ষার সময়কাল তৈরি করতে ব্যবহার করছি । অপেক্ষার সময় আমি অগ্রগতি বার এবং বাতিল বোতামের সাথে একটি ডায়ালগ প্রদর্শন করছি ।

আমার সমস্যাটি হ'ল সময় পার হওয়ার আগে পোস্টডিলেড কার্যটি বাতিল করার কোনও উপায় আমি খুঁজে পাচ্ছি না ।



আশা করি এই সংক্ষিপ্ত বিবরণ gist.github.com/imammubin/a587192982ff8db221da14d094df6fb4 হ্যান্ডলার এবং রানযোগ্য ফাংশন সহ স্ক্রিন লঞ্চার হিসাবে মূল কার্যকলাপ , ফায়ারবেস সহ বেস পছন্দ পছন্দ লগইন ব্যবহারকারীর সাথে লগইন পৃষ্ঠা বা ফিড পৃষ্ঠাতে রান্নেবল রান।
মুবিন

উত্তর:


479

দেরিতে চলার জন্য পোস্ট করতে আমি এটি করি:

myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH); 

এবং এটি এটি সরাতে: myHandler.removeCallbacks(myRunnable);


74
আপনি যদি হ্যান্ডলারের সমস্ত কলব্যাক এবং বার্তাগুলি বাতিল করার সামর্থ্য রাখেন এবং এই প্রশ্নের স্বীকৃত উত্তরের তৃতীয় পয়েন্টটি রান্নেবলের কাছে উল্লেখ রাখতে না চান তবে অন্য বিকল্প যা আমার ক্ষেত্রে কার্যকর হবে বলে মনে হচ্ছে: স্ট্যাকওভারফ্লো। কম / প্রশ্ন / 11299440 / ... (মূলত কলিং myHandler.removeCallbacksAndMessages (নাল);)
মিক

মুছে ফেলা কলব্যাক্স এবং ম্যাসেজগুলি কৌশলটি করতে পারে তবে ব্যক্তিগতভাবে আমি নির্ধারিত রান্নেবলের উপর নিয়ন্ত্রণ রাখতে পছন্দ করি। এক জোড়া রান্নেবল ইনস্ট্যান্সিং এবং পরিচালনা করা আপনাকে অ্যাপের পারফরম্যান্সগুলি মেরে ফেলবে না; অন্যথায়, আপনার যদি আরও দুটি বা তিনটি রান্নেবলের প্রয়োজন হয় তবে আপনার আরও শক্তিশালী কিছু দরকার হতে পারে, imho।
andrea.rinaldi

59

আপনি যদি একই হ্যান্ডলারের কাছে একাধিক অভ্যন্তরীণ / বেনামে রান্নেবলগুলি পাস করে থাকেন এবং আপনি একই ইভেন্ট ব্যবহারে সমস্ত বাতিল করতে চান

handler.removeCallbacksAndMessages(null);

ডকুমেন্টেশন অনুযায়ী,

কলব্যাক এবং প্রেরিত বার্তাগুলির কোনও মুলতুবি পোস্ট মুছে ফেলুন যার উদ্দেশ্য টোকেন। যদি টোকেনটি শূন্য থাকে, সমস্ত কলব্যাক এবং বার্তা মুছে ফেলা হবে।


এটি একবারে সমস্ত চলমান কলব্যাকগুলি সরিয়ে ফেলবে। অন্যথায়, removeCallbacks(callback) নির্দিষ্ট কলব্যাক সরিয়ে ফেলার জন্য কল করুন
ফাউন্ডআউটস্ল্যাসম

18

আর একটি উপায় হ'ল রানযোগ্য নিজেই পরিচালনা করা:

Runnable r = new Runnable {
    public void run() {
        if (booleanCancelMember != false) {
            //do what you need
        }
    }
}

14
বুলিয়ান ক্যান্সেলমেম্বারকে চূড়ান্ত হতে হবে না, যার অর্থ এটি পরিবর্তন করা যায় না এবং এভাবে এই উদ্দেশ্যে অকেজো?
স্টিলথকপ্টার

9
পছন্দ করুন
বেনোইট জাদিনন

7
@ পাবলিসকো এটি চালানোযোগ্য বেনামে থাকলেও এটি চূড়ান্ত হবে না। এটি বদ্ধ শ্রেণিতে সদস্য হতে পারে।
মার্টিন

6
এটিকে নিম্নমানের নয়, সাবধানতা অবলম্বন করুন। এই পদ্ধতির সাহায্যে, যদি একাধিক রানবেবলগুলি বিলম্বিত পোস্ট করা হয় তবে আপনি দুষ্টু বর্ণের অবস্থার মধ্যে যেতে পারেন। এটি রান্নেবলকে বাতিল করে না, সুতরাং সেই কোডটি কার্যকর হবে কি হবে না তা প্রতিটি পোস্ট রান্নেবলের জন্য নির্দিষ্ট মুহুর্তে বুলিয়ানক্যান্সেলমেম্বরের মান নির্ভর করে । যা দ্রুত অনির্দেশ্য হয়ে উঠতে পারে।
ডেনিস কে

1
রান্নেবল যদি বেনামে না থাকে তবে এর অর্থ এটিতে আমার কাছে একটি রেফারেন্স রয়েছে ( rএই ক্ষেত্রে) যার অর্থ আমি ব্যবহার করতে পারি myHandler.removeCallbacks(r);। যদি রান্নেবলটি বেনামে থাকে তবে পতাকাটি বদ্ধ শ্রেণিতে একটি সদস্য হবে, যার অর্থ পতাকাটি পরিবর্তনের জন্য আমার সেই অবজেক্টের একটি রেফারেন্স প্রয়োজন, যার অর্থ আবারও আমার কাছে থাকতে হবে r, যার অর্থ আমি করতে পারি myHandler.removeCallbacks(r);। এবং যদি আমি তা করি myHandler.removeCallbacks(r);তবে এই জাতীয় পতাকা মোটেই প্রয়োজন নেই। আমি কিছু অনুপস্থিত করছি?
nacho4d

1

এখানে একটি ক্লাস বিলম্বিত ক্রিয়াকলাপের জন্য একটি বাতিল পদ্ধতি সরবরাহ করে

public class DelayedAction {

private Handler _handler;
private Runnable _runnable;

/**
 * Constructor
 * @param runnable The runnable
 * @param delay The delay (in milli sec) to wait before running the runnable
 */
public DelayedAction(Runnable runnable, long delay) {
    _handler = new Handler(Looper.getMainLooper());
    _runnable = runnable;
    _handler.postDelayed(_runnable, delay);
}

/**
 * Cancel a runnable
 */
public void cancel() {
    if ( _handler == null || _runnable == null ) {
        return;
    }
    _handler.removeCallbacks(_runnable);
}}

0

পোস্টের ভিতরে ক্যান্সেলক্যালব্যাকস (এটি) কল করার সময় এটি আমার পক্ষে কাজ করেছিল যখন এটি একটি বুলিয়ানের মাধ্যমে হস্তান্তর করে চালানোতে বিলম্বিত হয়েছিল

Runnable runnable = new Runnable(){
    @Override
    public void run() {
        Log.e("HANDLER", "run: Outside Runnable");
        if (IsRecording) {
            Log.e("HANDLER", "run: Runnable");
            handler.postDelayed(this, 2000);
        }else{
            handler.removeCallbacks(this);
        }
    }
};

3
আপনার কোডে কোনও "বাতিলক্যালব্যাকস" নেই। সম্ভবত 'কারণ এর অস্তিত্ব নেই? :)
অবিশ্বাস্য জানুয়ারী

-1

আশা করি এই টুকরোটি সহায়তা https://gist.github.com/imammubin/a587192982ff8db221da14d094df6fb4

হ্যান্ডলার ও রান রানযোগ্য ফাংশন সহ স্ক্রিন লঞ্চার হিসাবে মেইনঅ্যাক্টিভিটি, ফায়ারবেস সহ বেস পছন্দ পছন্দ লগইন ব্যবহারকারী সহ পৃষ্ঠা বা ফিড পৃষ্ঠাতে লগইন করতে রান রানযোগ্য to

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.