繁体   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