ฉันกำลังใช้handler.postDelayed()
เพื่อสร้างช่วงเวลารอก่อนที่แอปของฉันจะเริ่มขึ้น ในช่วงเวลารอฉันกำลังแสดงกล่องโต้ตอบพร้อมแถบความคืบหน้าและปุ่มยกเลิก
ปัญหาของฉันคือฉันไม่สามารถหาวิธียกเลิกงานpostDelayedก่อนเวลาที่ผ่านไป
ฉันกำลังใช้handler.postDelayed()
เพื่อสร้างช่วงเวลารอก่อนที่แอปของฉันจะเริ่มขึ้น ในช่วงเวลารอฉันกำลังแสดงกล่องโต้ตอบพร้อมแถบความคืบหน้าและปุ่มยกเลิก
ปัญหาของฉันคือฉันไม่สามารถหาวิธียกเลิกงานpostDelayedก่อนเวลาที่ผ่านไป
คำตอบ:
ฉันทำสิ่งนี้เพื่อโพสต์ runnable ล่าช้า:
myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH);
และนี่เพื่อลบ: myHandler.removeCallbacks(myRunnable);
ในกรณีที่คุณมี runnables ภายใน / ไม่ระบุชื่อหลายตัวส่งผ่านไปยังตัวจัดการเดียวกันและคุณต้องการยกเลิกทั้งหมดในการใช้กิจกรรมเดียวกัน
handler.removeCallbacksAndMessages(null);
ตามเอกสาร
ลบโพสต์ที่รอดำเนินการของการเรียกกลับและข้อความที่ส่งซึ่ง obj คือโทเค็น หากโทเค็นเป็นโมฆะการโทรกลับและข้อความทั้งหมดจะถูกลบ
removeCallbacks(callback)
เพื่อลบโทรกลับเฉพาะ
อีกวิธีหนึ่งในการจัดการ Runnable นั้น:
Runnable r = new Runnable {
public void run() {
if (booleanCancelMember != false) {
//do what you need
}
}
}
r
ในกรณีนี้) myHandler.removeCallbacks(r);
ซึ่งหมายความว่าฉันสามารถใช้ หาก Runnable จะไม่ระบุชื่อแล้วธงจะต้องเป็นสมาชิกในชั้นล้อมรอบซึ่งหมายความว่าฉันต้องมีการอ้างอิงไปยังวัตถุที่มีการเปลี่ยนแปลงธงซึ่งหมายความว่าฉันอีกครั้งจะต้องมีอยู่แล้วซึ่งหมายความว่าฉันสามารถทำได้r
myHandler.removeCallbacks(r);
และถ้าฉันทำmyHandler.removeCallbacks(r);
เช่นนั้นก็ไม่จำเป็นต้องตั้งค่าสถานะดังกล่าวเลย ฉันพลาดอะไรไปรึเปล่า?
นี่คือคลาสที่ให้วิธีการยกเลิกสำหรับการดำเนินการล่าช้า
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);
}}
มันทำงานสำหรับฉันเมื่อฉันเรียกว่า 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);
}
}
};
หวังว่าความช่วยเหลือนี้จะช่วยให้https://gist.github.com/imammubin/a587192982ff8db221da14d094df6fb4
MainActivity เป็นตัวเปิดหน้าจอที่มีฟังก์ชั่นการจัดการ & runnable, Runnable วิ่งไปที่หน้าเข้าสู่ระบบหรือหน้าฟีดที่มีผู้ใช้ฐานเข้าสู่ระบบการตั้งค่าฐานกับ firebase