ยกเลิกกระบวนการ handler.postdelayed


259

ฉันกำลังใช้handler.postDelayed()เพื่อสร้างช่วงเวลารอก่อนที่แอปของฉันจะเริ่มขึ้น ในช่วงเวลารอฉันกำลังแสดงกล่องโต้ตอบพร้อมแถบความคืบหน้าและปุ่มยกเลิก

ปัญหาของฉันคือฉันไม่สามารถหาวิธียกเลิกงานpostDelayedก่อนเวลาที่ผ่านไป



หวังว่าส่วนสำคัญนี้จะช่วยgist.github.com/imammubin/a587192982ff8db221da14d094df6fb4 MainActivity เป็นตัวเรียกใช้หน้าจอพร้อมตัวจัดการ & ฟังก์ชันที่รันได้ Runnable เพื่อเรียกใช้หน้าเข้าสู่ระบบหรือหน้าฟีดที่มีผู้ใช้ฐานเข้าสู่ระบบที่มี firebase
มูบา

คำตอบ:


479

ฉันทำสิ่งนี้เพื่อโพสต์ runnable ล่าช้า:

myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH); 

และนี่เพื่อลบ: myHandler.removeCallbacks(myRunnable);


74
หากคุณสามารถที่จะยกเลิกการเรียกกลับและข้อความทั้งหมดในการจัดการและไม่ต้องการให้มีการให้การอ้างอิงไปยังที่ทำงานได้จุดที่สามในคำตอบที่ได้รับการยอมรับสำหรับคำถามนี้เป็นอีกทางเลือกหนึ่งที่ดูเหมือนว่าจะทำงานสำหรับกรณีของฉันอยู่แล้ว: StackOverflow com / คำถาม / 11299440 / … (โดยพื้นฐานแล้วเรียก myHandler.removeCallbacksAndMessages (null);)
Mick

removeCallbacksAndMessages สามารถทำเคล็ดลับได้ แต่โดยส่วนตัวแล้วฉันต้องการควบคุม runnables ตามกำหนดการ การอินสแตนซ์และการจัดการ Runnables คู่หนึ่งจะไม่ทำให้ประสิทธิภาพการทำงานแอปของคุณลดลง มิฉะนั้นถ้าคุณต้องการมากกว่าสองหรือสาม Runnables คุณอาจต้องการสิ่งที่มีประสิทธิภาพยิ่งขึ้น imho
andrea.rinaldi

59

ในกรณีที่คุณมี runnables ภายใน / ไม่ระบุชื่อหลายตัวส่งผ่านไปยังตัวจัดการเดียวกันและคุณต้องการยกเลิกทั้งหมดในการใช้กิจกรรมเดียวกัน

handler.removeCallbacksAndMessages(null);

ตามเอกสาร

ลบโพสต์ที่รอดำเนินการของการเรียกกลับและข้อความที่ส่งซึ่ง obj คือโทเค็น หากโทเค็นเป็นโมฆะการโทรกลับและข้อความทั้งหมดจะถูกลบ


การดำเนินการนี้จะลบการเรียกกลับที่รันได้ทั้งหมดหนึ่งครั้ง มิฉะนั้นโทร removeCallbacks(callback) เพื่อลบโทรกลับเฉพาะ
FindOutIslamNow

18

อีกวิธีหนึ่งในการจัดการ Runnable นั้น:

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

14
booleanCancelMember จะต้องไม่ใช่ครั้งสุดท้ายซึ่งหมายความว่าจะไม่สามารถเปลี่ยนแปลงได้และทำให้ไร้ประโยชน์สำหรับจุดประสงค์นี้
stealthcopter

9
@stealthcopter ไม่มันไม่จำเป็นต้องเป็น
เบอนัวต์ Jadinon

7
@pablisco ไม่จำเป็นต้องเป็นที่สิ้นสุดแม้ว่า Runnable จะไม่ระบุตัวตน มันสามารถเป็นสมาชิกในชั้นเรียนปิดล้อม
Martin

6
ไม่ใช่การลงคะแนนนี้ แต่ต้องระวัง ด้วยวิธีการนี้หากมีการโพสต์ Runnables หลายรายการล่าช้าคุณอาจพบเจอกับสภาพการแข่งขันที่น่ารังเกียจ สิ่งนี้ไม่ได้ยกเลิก Runnable ดังนั้นรหัสนั้นจะถูกดำเนินการหรือไม่นั้นขึ้นอยู่กับมูลค่าของ booleanCancelMember ในช่วงเวลาที่เฉพาะเจาะจงสำหรับRunnable ที่โพสต์แต่ละรายการ ซึ่งอาจกลายเป็นสิ่งที่คาดเดาไม่ได้อย่างรวดเร็ว
Dennis K

1
หาก Runnable ไม่ annonymous มันหมายความว่าฉันมีการอ้างอิงถึงมัน ( rในกรณีนี้) myHandler.removeCallbacks(r);ซึ่งหมายความว่าฉันสามารถใช้ หาก Runnable จะไม่ระบุชื่อแล้วธงจะต้องเป็นสมาชิกในชั้นล้อมรอบซึ่งหมายความว่าฉันต้องมีการอ้างอิงไปยังวัตถุที่มีการเปลี่ยนแปลงธงซึ่งหมายความว่าฉันอีกครั้งจะต้องมีอยู่แล้วซึ่งหมายความว่าฉันสามารถทำได้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

มันทำงานสำหรับฉันเมื่อฉันเรียกว่า CancelCallBacks (นี้) ภายในโพสต์ล่าช้าเรียกใช้โดยส่งมันผ่านบูลีน

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
ไม่มี "CancelCallBacks" ในรหัสของคุณ อาจเป็นเพราะมันไม่มีอยู่จริง? :)
เหลือเชื่อ Jan

-1

หวังว่าความช่วยเหลือนี้จะช่วยให้https://gist.github.com/imammubin/a587192982ff8db221da14d094df6fb4

MainActivity เป็นตัวเปิดหน้าจอที่มีฟังก์ชั่นการจัดการ & runnable, Runnable วิ่งไปที่หน้าเข้าสู่ระบบหรือหน้าฟีดที่มีผู้ใช้ฐานเข้าสู่ระบบการตั้งค่าฐานกับ firebase

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