如何在android中设置计时器

n17*_*911 165 android

在android中设置计时器以启动任务的正确方法是什么(我创建的一个不会改变UI的功能)?使用Java方式:http: //docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html

或者在android(android的处理程序)中有更好的方法?

Sam*_*uel 154

是的java的计时器可以使用,但随着问题要求更好的方式(移动).这在这里解释.


为了StackOverflow:

由于Timer创建一个新线程,它可能被认为很重,

如果你需要的只是在活动运行时回调,那么Handler可以与a一起使用

Runnable:

private final int interval = 1000; // 1 Second
private Handler handler = new Handler();
private Runnable runnable = new Runnable(){
    public void run() {
        Toast.makeText(MyActivity.this, "C'Mom no hands!", Toast.LENGTH_SHORT).show();
    }
};
...
handler.postAtTime(runnable, System.currentTimeMillis()+interval);
handler.postDelayed(runnable, interval);
Run Code Online (Sandbox Code Playgroud)

消息

private final int EVENT1 = 1; 
private Handler handler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {         
        case Event1:
            Toast.makeText(MyActivity.this, "Event 1", Toast.LENGTH_SHORT).show();
            break;

        default:
            Toast.makeText(MyActivity.this, "Unhandled", Toast.LENGTH_SHORT).show();
            break;
        }
    }
};

...

Message msg = handler.obtainMessage(EVENT1);
handler.sendMessageAtTime(msg, System.currentTimeMillis()+interval);
handler.sendMessageDelayed(msg, interval);
Run Code Online (Sandbox Code Playgroud)

另外,如果你想在另一个线程的UI线程中运行一段代码,可以使用这种方法.

如果你需要回电话,即使你的活动没有运行,你也可以使用AlarmManager

  • 请注意,导入“android.os.Handler”,而不是“java.util.logging” (2认同)

Man*_*yNS 140

通过java.util.Timerjava.util.TimerTask使用计时器的标准Java方法在Android 运行良好,但您应该知道此方法创建了一个新线程.

您可以考虑使用非常方便的Handler类(android.os.Handler)并通过sendMessageAtTime(android.os.Message, long)或向处理程序发送消息sendMessageDelayed(android.os.Message, long).收到消息后,您可以运行所需的任务.第二个选项是创建一个Runnable对象,并通过Handler的函数postAtTime(java.lang.Runnable, long)或它来安排它postDelayed(java.lang.Runnable, long).

  • @KurtisNusbaum这不一定是真的,这取决于背景.AlarmManager上的文档说:"注意:警报管理器适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未运行.对于正常的计时操作(刻度,超时等)使用Handler更容易,也更有效率." (65认同)
  • 这是在android中做错事的错误方法.在android中,您希望使用Alarm Manager(developer.android.com/reference/android/app/AlarmManager.html)以便将来运行任务. (10认同)
  • 使用Handler方法调度任务只有在应用程序获得了wakeLock时才可靠,因此您确定手机不会进入睡眠状态.如果手机进入睡眠状态,则sendMessageDelayed以及sendMessageAtTime将无效.因此,在那种情况下,AlarmManager将是可靠的选择. (10认同)
  • @Kurtis Nusbaum问题并未说明未来任务有多远. (8认同)
  • @Scienceprodigy啊,我明白了.很公平. (4认同)

Thy*_*hys 128

正如我所看到的,java.util.Timer最常用于实现计时器.

对于重复任务:

new Timer().scheduleAtFixedRate(task, after, interval);
Run Code Online (Sandbox Code Playgroud)

对于单次任务:

new Timer().schedule(task, after);
Run Code Online (Sandbox Code Playgroud)


任务是在初始执​​行
之后要执行的方法
(间隔重复执行的时间)

  • 我只想补充说,时间是以毫秒为单位 (8认同)
  • [scheduleAtFixedRate]的android开发文档(https://developer.android.com/reference/java/util/Timer.html#scheduleAtFixedRate%28java.util.TimerTask,%20long,%20long%29) (2认同)
  • 这么多赞成票.你可以这样做.但@Samuel描述了更好的方法.请参阅他的"在此解释哪个"链接了解原因.另外,无法从Timer线程更新UI!并在其他线程中查看其他基于Handler的答案:(简单)http://stackoverflow.com/a/6702767/199364,或(显示各种替代方案)http://stackoverflow.com/a/4598737/199364 (2认同)

Gau*_*kar 26

我希望这个有用,并且可能需要花费更少的精力来实现 Android CountDownTimer类

例如

 new CountDownTimer(30000, 1000) {
      public void onTick(long millisUntilFinished) {
          mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
      }

      public void onFinish() {
          mTextField.setText("done!");
      }  
}.start();
Run Code Online (Sandbox Code Playgroud)


vku*_*rni 16

大概 Timerconcept

new CountDownTimer(40000, 1000) { //40000 milli seconds is total time, 1000 milli seconds is time interval

 public void onTick(long millisUntilFinished) {
  }
  public void onFinish() {
 }
}.start();
Run Code Online (Sandbox Code Playgroud)

要么

方法2 ::

编程定时器

添加一个名为time的int的新变量.将其设置为0.将以下代码添加到MainActivity.java中的onCreate函数.

//Declare the timer
Timer t = new Timer();
//Set the schedule function and rate
t.scheduleAtFixedRate(new TimerTask() {

    @Override
    public void run() {
        //Called each time when 1000 milliseconds (1 second) (the period parameter)
    }

},
//Set how long before to start calling the TimerTask (in milliseconds)
0,
//Set the amount of time between each execution (in milliseconds)
1000);
Run Code Online (Sandbox Code Playgroud)

进入run方法并添加以下代码.

//We must use this function in order to change the text view text
runOnUiThread(new Runnable() {

    @Override
    public void run() {
        TextView tv = (TextView) findViewById(R.id.main_timer_text);
        tv.setText(String.valueOf(time));
        time += 1;
    }

});
Run Code Online (Sandbox Code Playgroud)


Tim*_*ell 11

这是情境性的.

Android文档建议您应该使用AlarmManager注册一个Intent,如果您的应用程序可能没有运行,它将在指定的时间触发.

否则,您应该使用Handler.

注意:警报管理器适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前未运行也是如此.对于正常的计时操作(刻度,超时等),使用Handler更容易,也更有效.


Riz*_*aib 11

我们走了......我们需要两节课.我发布的代码会在每5秒(5000毫秒)之后更改移动音频配置文件...

我们的头等舱

public class ChangeProfileActivityMain extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        Timer timer = new Timer();
        TimerTask updateProfile = new CustomTimerTask(ChangeProfileActivityMain.this);
        timer.scheduleAtFixedRate(updateProfile, 0, 5000);
    }

}
Run Code Online (Sandbox Code Playgroud)

我们的第二类

public class CustomTimerTask extends TimerTask {

    private AudioManager audioManager;
    private Context context;
    private Handler mHandler = new Handler();

    // Write Custom Constructor to pass Context
    public CustomTimerTask(Context con) {
        this.context = con;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub

        // your code starts here.
        // I have used Thread and Handler as we can not show Toast without starting new thread when we are inside a thread.
        // As TimePicker has run() thread running., So We must show Toast through Handler.post in a new Thread. Thats how it works in Android..
        new Thread(new Runnable() {
            @Override
            public void run() {
                audioManager = (AudioManager) context.getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        if(audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT) {
                            audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                            Toast.makeText(context, "Ringer Mode set to Normal", Toast.LENGTH_SHORT).show();
                        } else {
                            audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
                            Toast.makeText(context, "Ringer Mode set to Silent", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
            }
        }).start();

    }

}
Run Code Online (Sandbox Code Playgroud)


小智 5

我是一个Android新手,但这里是我根据上面的答案创建的计时器类.它适用于我的应用程序,但我欢迎任何建议.

用法示例:

...{
public Handler uiHandler = new Handler();

  private Runnable runMethod = new Runnable()
    {
        public void run()
        {
              // do something
        }
    };

    timer = new UITimer(handler, runMethod, timeoutSeconds*1000);       
        timer.start();
}...

public class UITimer
{
    private Handler handler;
    private Runnable runMethod;
    private int intervalMs;
    private boolean enabled = false;
    private boolean oneTime = false;

    public UITimer(Handler handler, Runnable runMethod, int intervalMs)
    {
        this.handler = handler;
        this.runMethod = runMethod;
        this.intervalMs = intervalMs;
    }

    public UITimer(Handler handler, Runnable runMethod, int intervalMs, boolean oneTime)
    {
        this(handler, runMethod, intervalMs);
        this.oneTime = oneTime;
    }

    public void start()
    {
        if (enabled)
            return;

        if (intervalMs < 1)
        {
            Log.e("timer start", "Invalid interval:" + intervalMs);
            return;
        }

        enabled = true;
        handler.postDelayed(timer_tick, intervalMs);        
    }

    public void stop()
    {
        if (!enabled)
            return;

        enabled = false;
        handler.removeCallbacks(runMethod);
        handler.removeCallbacks(timer_tick);
    }

    public boolean isEnabled()
    {
        return enabled;
    }

    private Runnable timer_tick = new Runnable()
    {
        public void run()
        {
            if (!enabled)
                return;

            handler.post(runMethod);

            if (oneTime)
            {
                enabled = false;
                return;
            }

            handler.postDelayed(timer_tick, intervalMs);
        }
    }; 
}
Run Code Online (Sandbox Code Playgroud)