数 45 秒,暂停 20 秒,然后用不同的标题重复

2024-02-09

在尝试限制电池使用时,我不需要有繁忙的循环,所以我不确定如何解决这个问题。

如果我有一个程序,允许某人唱歌 45 秒,然后他们暂停 20 秒喝一杯,然后重复唱一定数量的歌曲。

我的计时器是在取消一次迭代并开始另一次迭代后,计时器无法正常工作 https://stackoverflow.com/questions/5751570/problem-getting-timer-to-work-after-cancelling-one-iteration-and-starting-another/5774610#5774610,但为了使其工作,当有人单击按钮时,它会开始第一个倒计时,但时间已排队,并显示标题,然后当时间完成时,它会显示Rest,然后 20 秒后会显示新标题。

So use sendMessageDelayed是一个问题,尽管它适用于第一部分。

理想情况下我希望有Runnable当达到倒计时时返回到某个控制器函数,然后该函数将使用 if 语句。

void Controller(int curCount) {
  if(curCount % 2 == 0) {
     // call thread that uses runnable with next song time limit and title
  } else {
     // call thread with 20 and "REST"
  }
}

但是,这只有在以下情况下才有效

Thread t = new Thread(runnable);
... // Go to controller, which will count down
t.join();

阻塞直到完成。我可以t.wait(time * 1000);代替t.join(),但这可能有点晚或早,因为计时器在计时方面并不完美,所以我认为这是不正确的。

那么,在没有不必要的轮询或繁忙循环的情况下执行此类操作的最佳方法是什么?

for(SongModel m : songList) {
  countdownTime(m.getSongTime(), m.getTitle);
  countdownTime(10, "REST");
}

Edit:

我想我不清楚当前计时器的问题。由于消息已排队,它将更改为Rest一边还在倒计时第一首歌的剩余时间,Runnable完成速度比Handler正在处理。因此,这种方法存在一个缺陷,导致我考虑使用sendMessageDelayed不过,不会像我希望的那样工作,如果我只需要倒计时一次/单击按钮就可以了,但我的需要是通过单击一个按钮来实现这一切,它启动该过程,然后应该模拟这for在我的问题末尾循环。


我们又来了:)

我写了这个并在 Eclipse 中使用 Eclair 模拟器对其进行了测试,并且运行良好。单击一次将从 54 计数到 0,然后从 20 计数到 0,然后从 45 计数到 0,依此类推,直到另一次单击将其取消。让我知道它是否符合您的需求。当然,用户界面只是最低限度的:

定时器测试.java

package com.aleadam.timertest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class TimerTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button button = (Button) findViewById(R.id.btn);
        button.setOnClickListener(new MyListener ());
    }

    private class MyListener implements OnClickListener {
        private long mStartTime = 0L;
        private boolean started = false;
        private boolean singing = true;
        private final Handler mHandler = new Handler();
        private Runnable mUpdateTimeTask;
        TextView label, timer;

        public MyListener() {
            super();
            label = (TextView) findViewById (R.id.lbl);
            timer = (TextView) findViewById (R.id.timer);
        }
        public void onClick(View v) {
            if (!started) {
                started = true;
                ((Button) v).setText(R.string.button_label_stop);
                mUpdateTimeTask = new Runnable() {
                    public void run() {
                        long millis = SystemClock.elapsedRealtime() - mStartTime;
                        if (singing && millis >= 45000L) {
                            label.setText(R.string.text_label_rest);
                            mStartTime = SystemClock.uptimeMillis();
                            timer.setText("20");
                            singing = false;
                        } else if (!singing && millis >= 20000L) {
                            label.setText(R.string.text_label_sing);
                            mStartTime = SystemClock.uptimeMillis();
                            timer.setText("45");
                            singing = true;
                        } else {
                            if (singing)
                                timer.setText(Long.toString(45-millis/1000));
                            else
                                timer.setText(Long.toString(20-millis/1000));
                        }
                        mHandler.postDelayed (mUpdateTimeTask, 1000);
                    }
                };    
                singing = true;
                mStartTime = SystemClock.uptimeMillis();
                label.setText(R.string.text_label_sing);
                timer.setText("45");
                mHandler.removeCallbacks(mUpdateTimeTask);
                mHandler.postDelayed(mUpdateTimeTask, 1000);
            } else {
                started = false;
                mHandler.removeCallbacks(mUpdateTimeTask);
                label.setText("");
                timer.setText("");
                ((Button) v).setText(R.string.button_label_start);
            }
        }
    }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/title_label"
    />
<Button
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/button_label_start"
    android:id="@+id/btn"
    />
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/lbl"
    />
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/timer"
    android:textSize="24dp"
    android:textStyle="bold" 
    android:typeface="monospace"/>
</LinearLayout>

字符串.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="title_label">Timer test - 45 + 20 sec</string>
    <string name="app_name">Timer Test</string>
    <string name="button_label_start">Click to start</string>
    <string name="text_label_sing">Sing for 45 seconds</string>
    <string name="text_label_rest">20 seconds to drink!</string>
    <string name="button_label_stop">Click to cancel</string>
</resources>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数 45 秒,暂停 20 秒,然后用不同的标题重复 的相关文章

随机推荐

  • Django复杂查询从groupby和having子句中获取数据

    我想在具有 CNT Status 的 MyUser 表上执行 group by 子句 原始查询如下所示 SELECT user id from user table GROUP BY user id HAVING COUNT status
  • 尝试运行 Docker 导致退出代码 127

    我正在尝试在使用 docker 的 Windows 中运行某个应用程序 由于该应用程序是 shell 脚本 因此我使用 cygwin 终端 作为 docker 的新手 我对其工作原理没有明确的想法 使用 boot2docker 我在 Win
  • C++ 中的“auto 运算符”是什么?

    Clang https en wikipedia org wiki Clang和 Visual Studio 编译器 但不是GCC https en wikipedia org wiki GNU Compiler Collection 允许
  • 应用模板上选择属性的 xslt 处理

    我有一个如下所示的 XSLT 并将该 xslt 应用于输入 xml 粘贴在下面 它工作正常 除了需要澄清的一件事 这是输入 xml
  • 这是 C# 4 中的协方差错误吗?

    在下面的代码中 我希望能够隐式转换elements to baseElements因为TBase可以隐式转换为IBase public interface IBase public interface IDerived IBase publ
  • 如何使用/绕过 Gmail 的 SMTP 出站发送限制?

    我正在使用我的 Gmail Apps for Domain 帐户在 Rails 应用程序中发送电子邮件以获取标准自动电子邮件 用户注册 忘记密码 通知管理员新评论等 但我担心每天设置的 500 封电子邮件限制由谷歌 谷歌建议克服该限制的一种
  • Python中的R函数rep()(复制列表/向量的元素)

    R 函数rep 复制向量的每个元素 gt rep c A B times 2 1 A B A B 这就像 Python 中的列表乘法 gt gt gt A B 2 A B A B 但使用rep R函数 还可以指定向量每个元素的重复次数 gt
  • OpenCV 的 unactorPoints 是否也可以纠正它们?

    我试图通过使用带有两个摄像头的 OpenCV 2 3 1 来确定两个对象之间的距离 但无法计算对象的 objectPoints OCV 2 3 1 MSVC Windows 7 我认为这是因为在计算视差之前没有对图像点进行校正 一 我首先要
  • 从 Heroku 中的 python 应用程序运行 java 子进程

    我是 Heroku 新手 我的 Flask Web 应用程序的后端逻辑实际上正在运行一个 Java 子进程 subprocess call 来获取一些辅助数据 我知道这样做是一件坏事 在部署时 Heroku 按预期工作 并从requirem
  • 在tinymce文本编辑器数据中的字符串末尾添加句点/点

    目前我的数据保存在 mysql 数据库中 如下所示 来自tinymce textarea 在 html 中显示数据时 我需要在字符串末尾附加一个句点或点 下面是示例 数据存储在数据库中 strong Hello World strong 当
  • 评估 XML 中的 XPath 表达式

    使用Add on SDK创建Firefox插件时 如何处理XML文件 使用 XPath 评估会引发错误 XPathResult 未定义 我正在尝试处理用这个代码 var iterator xmlDoc evaluate stream xml
  • 覆盖 left_join dplyr 来更新数据

    我的问题与此类似 但是我在 LHS 中有其他应保留的列https stackoverflow com a 35642948 9285732 https stackoverflow com a 35642948 9285732 y是一个子集x
  • 角度套接字 io 未定义

    这里有一个建议 https github com btford angular socket io issues 127 https github com btford angular socket io issues 127 确保您有 s
  • 如何使用缓冲区溢出攻击替换堆栈上的返回地址

    对于家庭作业 我正在执行一系列缓冲区溢出攻击 有人给了我一个要反汇编的程序 这是一个不正确调用的函数的 C 源代码gets 以及我应该强制程序调用的其他几个函数的源代码 对于其中一项任务 我必须 注入一些改变值的代码 然后 返回上述方法之一
  • 使用哪个 Java 库来录制连接的摄像机的视频?

    您可能认为有一个简单的解决方案 但没有 我的应用程序需要从 USB 火线 或任何连接 连接的相机捕获流 结果将是一个类似的文件输出 flv 我希望能够检测所有连接的摄像机并选择使用哪一台 同时使用一台或多台 gt 一个或多个输出文件 应用程
  • 不带绑定的验证规则

    我想在文本框上使用 ValidationRules 及其 UI 效果 而不实际将任何内容绑定到文本框 我想将文本框用于某些不绑定到任何内容但需要在焦点丢失后使用 ValidationRules 验证输入的输入 能做到吗
  • 如何创建仅可由特定类使用的构造函数。 (C++ Friend 相当于 C# 中的内容)

    据我所知 在C 中 不象C 中那样支持 friend 关键字 是否有另一种方法来设计一个类 可以实现相同的最终结果 而无需诉诸不可用的 friend 关键字 对于那些还不知道的人来说 Friend 关键字允许程序员指定类 X 的成员只能由类
  • 使用方法在 ArrayList 中循环

    在很多帮助下 我开发了一种方法 可以制作字谜词 然后将它们添加到ArrayList public void f String s String anagram ArrayList
  • 删除崩溃的 Innodb 表

    我无法删除 删除崩溃的 Innodb 表 我收到以下错误 错误 1051 42S02 未知表 帐户 如果我想创建它 我会收到以下错误 错误 1005 HY000 无法创建表 accounts errno 1 我的服务器在意外断电后会发生这种
  • 数 45 秒,暂停 20 秒,然后用不同的标题重复

    在尝试限制电池使用时 我不需要有繁忙的循环 所以我不确定如何解决这个问题 如果我有一个程序 允许某人唱歌 45 秒 然后他们暂停 20 秒喝一杯 然后重复唱一定数量的歌曲 我的计时器是在取消一次迭代并开始另一次迭代后 计时器无法正常工作 h