在android中设置计时器以启动任务的正确方法是什么(我创建的一个不会改变UI的功能)?使用Java方式:http: //docs.oracle.com/javase/1.5.0/docs/api/java/util/Timer.html
或者在android(android的处理程序)中有更好的方法?
我正在使用计时器来制作秒表.计时器通过增加整数值来工作.我想通过不断更新textview在活动中显示此值.
这是我尝试更新活动的textview服务的代码:
protected static void startTimer() {
isTimerRunning = true;
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
elapsedTime += 1; //increase every sec
StopWatch.time.setText(formatIntoHHMMSS(elapsedTime)); //this is the textview
}
}, 0, 1000);
}
Run Code Online (Sandbox Code Playgroud)
关于在错误的线程中更新UI,我遇到了一些错误.
如何调整我的代码来完成不断更新textview的任务?
我对Android 有点困惑Timer和AlarmManager使用.
它们之间的主要区别是什么?
他们都计划每隔A秒运行一次任务.他们首选使用的主要方案是什么?
例如,对于X情况,Timer另一方面使用,对于Y情况,请使用AlarmManager.
请参阅@Yuri从此处发布的代码.如何在一定次数后停止计时器 .如果我想因某些条件而停止它,然后再重新启动它.我该怎么做呢?
private final static int DELAY = 10000;
private final Handler handler = new Handler();
private final Timer timer = new Timer();
private final TimerTask task = new TimerTask() {
private int counter = 0;
public void run() {
handler.post(new Runnable() {
public void run() {
Toast.makeText(MainActivity.this, "test", Toast.LENGTH_SHORT).show();
}
});
if(++counter == 4) {
timer.cancel();
}
//do some stuff in my app
//restart the timer again
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer.schedule(task, …Run Code Online (Sandbox Code Playgroud) 我正在编写一个体育应用程序,需要跟踪季度/半/周期的流逝时间.经过的时间需要精确到秒.即使用户通过按下电源按钮明确地将设备置于睡眠模式,游戏时钟也需要继续运行.
我第一次尝试使用Handler.postDelayed()来触发每200ms的时钟滴答和WindowManager.LayoutParms.FLAG_KEEP_SCREEN_ON,以确保屏幕超时不会停止"时钟".但我很快了解到,这是可以通过按下电源按钮手动把睡觉的装置来规避这种方法.此外,postDelayed()方法正在经历一些时钟漂移,显然是在run()方法中花费的时间的结果.实际数字仍然是准确的,但不是对齐,例如,在用户容易理解的5秒边界上 - 所涉及的定时器开始漂移,导致一些可理解的用户混淆.
经过一番研究后,我找到了使用服务,java定时器,AlarmManager和PartialWakeLock来实现定时器的技术.服务本身不能解决与设备进入睡眠状态相关的问题.Java定时器(如服务)无法解决设备进入休眠状态的问题.AlarmManager似乎是一个很好的方法,但我担心这不适合使用AlarmManager(即报警之间的间隔非常短).使用PartialWakeLock也看起来很有希望,但它本身并没有解决时钟漂移问题,我遇到了.
我将尝试组合AlarmManager和PartialWakeLock.我们的想法是,AlarmManager将有助于对抗时钟漂移和PartialWakeLock,以帮助保持代码简单(手指交叉).我希望这种方法能够在节能,代码复杂性和用户期望之间取得合理的平衡.任何意见是极大的赞赏.
谢谢,
丰富
我想设置这个textview:
<TextView
android:id="@+id/timer"
android:layout_width="100dp"
android:layout_height="30dp"
android:layout_above="@+id/directions"/>
Run Code Online (Sandbox Code Playgroud)
做个计时器.因此,文本应该是一个计时器,如0:30然后0:29 ...持续30秒.一旦计时器是0:00,我可以调用另一种方法; 我可以打印出"再试一次"并重启计时器.
请不要暂停,请不要标记为重复,请回答我!我需要每200毫秒完成一些东西,我需要它平滑而均匀.要做的任务是中等重量(在两种情况下,问题1和2).搜索定时器看起来像社区的最佳解决方案是使用处理程序,runnable和postDelayed(),(Android计时器?操作方法?).
更新的问题:
- 如果我必须与UI,postDelayed()或schedule()/ scheduleAtFixedRate()进行交互,那么哪种方式最精确,最快?
- 如果我不需要与UI,postDelayed()或schedule()/ scheduleAtFixedRate()进行交互,那么哪种方式最准确,最快?
- 两种方式可以在主进程上执行还是在单独的进程上执行?怎么样 ?
谢谢.一些例子......
这样我有mainclass本地对象,但它是一个新线程吗?这是一个很好的实践吗?
timer.schedule( new TimerTask() {
@Override
public void run() {
textview.setText(str);
//other stuff
}
}, 0, 200);
Run Code Online (Sandbox Code Playgroud)
接下来是另一个有计划,任务是在一个单独的任务,而不是计时器本身,我猜,我不能直接与UI交互,我猜...
timer.schedule( new aclass(), 0, 200);
Run Code Online (Sandbox Code Playgroud)
处理方式(来自Dave.B):
Handler timerHandler = new Handler();
Runnable timerRunnable = new Runnable() {
@Override
public void run() {
TextView.setText(str);
// other stuff
timerHandler.postDelayed(this, 500); }
};
@Override
public void onCreate(Bundle savedInstanceState) {
...
timerHandler.postDelayed(timerRunnable, 0);
}
Run Code Online (Sandbox Code Playgroud) 我想结束从Android设备到Web服务器的HTTP请求,并定期检查数据库的特定数据(每分钟一次).我无法为此实现计时器.
谢谢
怎么能在android中完成?
public final Timer timer = new Timer(10, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Do task here
}
});
Run Code Online (Sandbox Code Playgroud)
我需要能够调用timer.start(); 来自计时器所在的活动.
我想我不完全了解Timer和TimerTask在Java和Android中的工作方式。现在,我定义了许多定期任务,这些任务要在计时器中安排。
我想知道我应该使用单个计时器来安排任务,还是为每个任务使用不同的计时器实例?计时器有自己的线程吗?预定任务是否在新线程中执行?后台发生了什么?
这些方法之间有什么区别?
方法1的样例代码:
private void initTasks() {
TimerTask task1 = new MyTimerTask1();
TimerTask task2 = new MyTimerTask2();
TimerTask task3 = new MyTimerTask3();
Timer timer = new Timer();
timer.schedule(task1, 0, TASK1_PERIOD);
timer.schedule(task2, 0, TASK2_PERIOD);
timer.schedule(task3, 0, TASK3_PERIOD);
}
class MyTimerTask1 extends TimerTask {
public void run() {
//do task1
}
}
class MyTimerTask2 extends TimerTask {
public void run() {
//do task2
}
}
class MyTimerTask3 extends TimerTask {
public void run() {
//do …Run Code Online (Sandbox Code Playgroud) 我尝试定期切换屏幕亮度低和高(1s),我认为这段代码应该工作:
SystemClock.sleep(1000);
params.screenBrightness = 0;
getWindow().setAttributes(params);
SystemClock.sleep(1000);
params.screenBrightness = 1;
getWindow().setAttributes(params);
Run Code Online (Sandbox Code Playgroud)
我已经尝试过这些代码,但它只完成了第二个代码(如果扩展代码,则完成最后一个代码)(即亮度= 1).因为我对此表示怀疑所以我把一个变量int i = 0,然后在每个sleep函数之后输入i ++,它显示我毕竟i = 2(通过显示字符串).我认为Android完成了总和,但我的屏幕只是对最后一个设置做出反应,而不是中间命令.你知道为什么会这样,我怎么能切换屏幕亮度?
我也尝试使用"for"循环,但没有运气.
希望尽快收到您的意见.
干杯,
当我的用户玩游戏时,我想将他们锁定30秒钟。我正在尝试使用SharedPreferences。我对SP不太熟悉,也不完全知道如何使用它。所以应该看起来像这样
ifGameOver(){
//lock the game for 30 seconds
//send users to main menu until 30seconds is over
}
Run Code Online (Sandbox Code Playgroud)
然后在主菜单上,我希望能够随着30秒的下降而看到TextView的计数。所以在这里我会getLong或某事(?)。谁能对此有所启示?