簡體   English   中英

如何在Android中阻止Runnable進入2個不同的Acivity?

[英]How Can I Stop Runnable Into 2 different Acivity with in Android?

我需要在5分鍾后或用戶完成某些操作時從SharedPreferences刪除一個值。 所以,當我添加該值時,我開始這樣做:

活動A.

Handler handler = new Handler();
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            mySharedPreferences.removeValue(mContext, Utils.MY_VALUE);
                        }
                    }, Utils.TIME_BEFORE_DELETE);

在用戶完成所有操作的情況下,我這樣做:

活動B.

mySharedPrefernces.removeValue(mContext, Utils.MY_VALUE);

但是如何才能將Handle停止進入第二個活動 還是有另一種方法嗎?

如果你想取消它,你可以使用布爾變量。

創建公共靜態布爾值以檢查任務是否被取消。

public static boolean isCanceled = false;

run()方法中使用它

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        if (!isCanceled)
                mySharedPreferences.removeValue(mContext, Utils.MY_VALUE);
        }
    }, Utils.TIME_BEFORE_DELETE);

如果你想取消然后設置:

isCanceled = true;
Runnable run = new Runnable() {
  @Override
  public void run() {
    mySharedPreferences.removeValue(mContext, Utils.MY_VALUE);
  }
};
Handler handler = new Handler();
handler.postDelayed(run, Utils.TIME_BEFORE_DELETE);
//to dismiss pending runnable
handler.removeCallbacks(run);

您可以使用handler.removeCallbacksAndMessages(null); 更多信息鏈接

在這種情況下,您可以使用帶有粘性標記的服務。 因此,您可以使用intent“start_handler”啟動服務並啟動處理程序。 當您需要取消處理程序時,您發送意圖停止處理程序和服務。 或者當時間過去並且處理程序調用您的代碼時,您也應該停止服務。 使用帶粘滯標志的服務提供了可能性恢復處理程序 此外,您還需要在運行處理程序時為正確的恢復處理程序添加一些邏輯節省時間。

更好的方法:示例代碼

publc static final Handler handler = new Handler();
public static final Runnable runnable = new Runnable() {
     public void run() {
        try {
            Log.d("Runnable","Handler is working");
           if(i == 5){ // just remove call backs
                handler.removeCallbacks(this); 
                Log.d("Runnable","ok");
            } else { // post again
                i++;
                handler.postDelayed(this, 5000); 
            }
        } catch (Exception e) { 
            e.printStackTrace();
        }   
   }
};

//now somewhere in a method
b1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
    handler.removeCallbacks(runnable); 
    handler.postDelayed(runnable, 5000); 
}
});

為此您不能使用直接Runnable內部處理程序,您需要獲取它的一個實例然后您可以這樣做,如下所示,

 Runnable myRunnable = new Runnable(){};

然后在處理程序中分配它

 handler.postDelayed(myRunnable);

並且不需要使用下面的線

 handler.removeCallbacks(myRunnable);
new Handler().postDelayed(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            //add your code hare
            finish();
        }
    }, 10000);

通過這種方式,您可以在修復時間內停止運行

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM