我需要在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 进入第二个活动?或者还有另一种方法吗?
答案 0 :(得分:3)
创建公共静态布尔值以检查任务是否被取消。
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;
答案 1 :(得分:1)
您可以使用handler.removeCallbacksAndMessages(null);
。更多信息link
在这种情况下,您可以使用带有粘性标记的服务。因此,您可以使用intent“start_handler”启动服务并启动处理程序。当您需要取消处理程序时,您发送意图停止处理程序和服务。或者当时间过去并且处理程序调用您的代码时,您也应该停止服务。 使用带粘滞标志的服务提供了可能性恢复处理程序此外,您还需要在运行处理程序时为正确的恢复处理程序添加一些逻辑节省时间。
答案 2 :(得分:1)
更好的方法:示例代码
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);
}
});
答案 3 :(得分:1)
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);
答案 4 :(得分:0)
为此您不能使用直接Runnable内部处理程序,您需要获取它的一个实例然后您可以像下面这样做,
Runnable myRunnable = new Runnable(){};
然后在处理程序中分配
handler.postDelayed(myRunnable);
并且不需要使用下面的行
handler.removeCallbacks(myRunnable);
答案 5 :(得分:0)
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
//add your code hare
finish();
}
}, 10000);
通过这种方式,您可以在修复时间停止运行