如何取消定时器并更新相同的定时器?

2023-12-02

我正在创建一个每 30 秒振动一次并发出蜂鸣声的应用程序,当我注销时,振动和蜂鸣声必须取消,当我登录时,振动和蜂鸣声应恢复。

注意:它必须每 30 秒振动一次并发出蜂鸣声,直到我退出

在我的应用程序中我正在使用TimerTask对于这个实现

这是振动和蜂鸣声的代码TimerTask

static TimerTask Task;
final static Handler handler = new Handler();
static Timer t = new Timer();

public static void vib() {

    Task = new TimerTask() {
        public void run() {
            handler.post(new Runnable() {
                public void run() {
                    Vibrator vibrator = (Vibrator) ApplicationUtils.getContext().getSystemService(Context.VIBRATOR_SERVICE);
                    vibrator.vibrate(3000);
                    playSound();
                    Log.d("TIMER", "Timer set on");
                }
            });
        }
    };
    t.schedule(Task, 0, 30000); 
}

这是我在注销部分使用的代码

public void stopvib() {
    if (Task != null) {
    //  Log.d("TIMER", "timer canceled");
        t.cancel();
        Task.cancel();
    }
}

注意:我还删除了Task.cancel();但我仍然遇到同样的错误

我的振动在注销并再次登录之前工作正常,但出现错误

java.lang.IllegalStateException: Timer was cancelled
    at java.util.Timer.scheduleImpl(Timer.java:562)
    at java.util.Timer.schedule(Timer.java:481)
    at com.vib(AlertListActivity.java:724)

任何人都可以帮我完成这个编码吗?我哪里做错了?


我最近运行了这段代码并且工作正常。这可以使用广播接收器来实现。您必须实现扩展 TimerTask 的单独 CustomTimer 任务:

Activity mActivity=null;
public MyCustomTimer(Activity mActivity) {
    this.mActivity=mActivity;
}
    @Override
    public void run() {
        this.mActivity.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                Toast.makeText(mActivity, "Write you code here",Toast.LENGTH_LONG).show();
                Log.d("MyCustomTimer","Call");
            }
        });

    }

之后,您必须在要实现“ vib() ”方法的类中实现 BroadCast Receive: 比方说,就我而言(仅作为示例)是 MainActivity:

public class MainActivity extends Activity {
    private MyCustomTimer myCustomTimer = null;
    BroadcastReceiver mBr_Start = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals("START_VIBRATION")) {
                System.out.println("onreceive :START_VIBRATION");
                vib();
            }
        }
    };
    BroadcastReceiver mBr_Stop = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals("STOP_VIBRATION")) {
                stopVibration();
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        IntentFilter mIntentFilter = new IntentFilter();
        mIntentFilter.addAction("START_VIBRATION");
        registerReceiver(mBr_Start, mIntentFilter);
        IntentFilter mIntentFilter2 = new IntentFilter();
        mIntentFilter2.addAction("STOP_VIBRATION");
        registerReceiver(mBr_Stop, mIntentFilter2);

        Button b1 = (Button) findViewById(R.id.button1);
        b1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, MySecondActivity.class)
                        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i);

            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    private void vib() {
        myCustomTimer = new MyCustomTimer(MainActivity.this);
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(myCustomTimer, 0, 30000);
    }

    private void stopVibration() {
        Log.d("MainActivity", "Before Cancel");
        if (null != myCustomTimer)
            myCustomTimer.cancel();
        Log.d("MainActivity", "After Cancel");
    }

}

现在,您可以通过执行以下几行来启动或停止振动: 开始振动:

Intent i=new Intent("START_VIBRATION");
                mActivity.sendBroadcast(i);

To Stop:

Intent i=new Intent("STOP_VIBRATION");
                mActivity.sendBroadcast(i);

笔记: MainActivity 的 onDestroy() (在您的情况下,您实现广播接收器的地方,取消注册广播接收器。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何取消定时器并更新相同的定时器? 的相关文章

随机推荐

  • 如何使用 __doPostBack()

    我正在尝试使用 ASP NET 创建异步回发 doPostBack 但我不知道该怎么做 我想使用普通 JavaScript 像单击按钮这样简单的事情可能会导致 doPostBack 触发事件 我只是想了解这个机制是如何运作的 您可以在 We
  • 将数据帧索引转换为日期时间

    如何将 pandas 字符串索引转换为日期时间格式 我的数据框df是这样的 value 2015 09 25 00 46 71 925000 2015 09 25 00 47 71 625000 2015 09 25 00 48 71 33
  • XmlTypeAttribute 仅适用于类中的属性

    我正在尝试使用 webservice 将其解析为 XML System Xml Serialization XmlTypeAttribute Namespace http www xx com zz Domain Public class
  • 如何在 FastAPI 中使用带有表单数据的 Pydantic 模型?

    我正在尝试从 HTML 表单提交数据并使用 Pydantic 模型对其进行验证 使用此代码 from fastapi import FastAPI Form from pydantic import BaseModel from starl
  • ggmap 400 错误请求

    我以前用过这个 而且一直有效 library ggmap newmap2 lt get openstreetmap bbox c left 71 2612362452596 bottom 42 3308503846824 right 71
  • 如何使Google电子表格的所有工作表在左上角显示A1?

    我有一个 72 页的 Google 电子表格 我正在尝试重置每个工作表 以便当您单击其选项卡时 它会在左上角显示 A1 也就是说 如果向下滚动一张工作表以致您看不到 A1 我希望它向后滚动以便您可以看到 我已经尝试过以下谷歌脚本 但没有任何
  • 创建独立的jar文件

    我已经建立了一个jar使用 Netbeans 创建文件 它在我的系统中运行良好 但我想做jar能够在所有具有 JRE 的系统中运行的文件 即使是classpath没有在该系统中设置 package circle import java aw
  • 使用静态成员变量时出现链接器错误

    我已经在这里浏览了与静态成员变量相关的所有线程 但不幸的是这无法帮助我找出原因 这就是问题 定义一个类名dvd db 包括以下成员 数据成员 DVD 名称 私有字符数组 大小 10 价格 私有双变量 数量 私有 int 变量 一个私有静态
  • 分析是什么以及如何分析我的 Java 程序?

    我听说过很多关于剖析的事情 这是怎么回事 据我了解 这是某种绩效衡量 但有人可以更清楚地阐述这一点 以便新手能够掌握这个想法 另外 我将 Eclipse IDE 用于我的 Java 程序 我可以使用 Eclipse IDE 分析我的程序吗
  • Pandas read_csv 在解析数字时忽略美元符号

    我有一个 csv 文件 其中一些单元格带有美元符号 例如 46 5 我强迫所有类型都是numpy float64在函数中pandas read csv 它抱怨ValueError could not convert string to fl
  • 如何修复 IE7 浮动清除组合

    我有一个 field wrapper 类 div 其中包含 3 个子 div field label field input 和 field error 我需要将 field label field input 并排放置 并将 field
  • Canvas/JS:计算倾斜斜坡碰撞中物体的新速度矢量?

    好吧 我正在 JS Canvas 上开发弹球游戏 我想知道如何处理鳍状肢和球之间的碰撞 我可以让脚蹼击球 但我对如何通过不同的脚蹼位置 角度 改变球的速度方向感到困惑 以下是我可以从脚蹼和球中使用的信息 this ballPosX ball
  • Django:管理中的验证错误

    新手警报 背景 这是我第一次编写一个需要验证的模型 我不能有两个Items具有重叠的 日期范围 我一切正常 除了当我引发 forms ValidationError 时 我得到死亡黄屏 debug true 或 500 页 debug fa
  • 如何快速制作不同形状的图像视图

    我想将普通的ios图像视图更改为下面的图像形状 如弧线 您可以使用它来根据您的要求设计形状 您可以向路径添加额外的线条 以防您需要修改贝塞尔曲线路径 创建一个自定义 UIImageView 类 并将故事板中的图像视图子类化为您的自定义类 i
  • 默认最大 Java 堆大小是如何确定的?

    如果我省略 Xmxn来自 Java 命令行的选项 则将使用默认值 根据Java 文档 默认值是在运行时根据系统配置选择的 哪些系统配置设置会影响默认值 在 Windows 上 您可以使用以下命令来查找运行应用程序的系统上的默认值 java
  • 如何使用url参数自动登录网站?

    我有一个链接 如果用户点击该链接 它应该会自动登录该网站 并从该网址读取用户名和密码 因此 用户无需填写用户名字段和密码字段即可查看该站点 url 格式是否正确 如果不正确 正确的格式是什么 我认为你需要的格式是 http 用户名 电子邮件
  • 如何将 MFP 8 Beta 移动应用程序迁移到 MFP 8 GA 版本?

    情况是这样的 我构建了一个与 mfp 8 beta 进行不同集成的应用程序 该应用程序在本地开发服务器上完全运行 并且主要在 Bluemix 上运行 测试期间 该应用程序的所有基本功能均在 MFP 8 Beta 服务器 本地和 Bluemi
  • 使用 yadcf 过滤器导出为 PDF 时标题不正确

    当我尝试使用过滤器 yadcf 将数据表导出为 pdf 时 标题始终显示过滤器中的每个案例 如何隐藏它 我的 JavaScript 是 var vsan vsan DataTable lengthMenu 1 10 40 50 All 10
  • Clojure:try,catch 宏也会关闭任何文件流(不是 with-open)

    UPDATE 感谢迄今为止所有的帮助 这是我的新代码 可以运行 但并不完全如我所愿 我需要它返回java异常 不要问我为什么 例子 safe 1 0
  • 如何取消定时器并更新相同的定时器?

    我正在创建一个每 30 秒振动一次并发出蜂鸣声的应用程序 当我注销时 振动和蜂鸣声必须取消 当我登录时 振动和蜂鸣声应恢复 注意 它必须每 30 秒振动一次并发出蜂鸣声 直到我退出 在我的应用程序中我正在使用TimerTask对于这个实现