我的Android应用程序中有一个动画,它会闪烁TextView不同的颜色.我使用了TimerTask,Timer和Runnable方法来实现它.我需要做的是在用户在onPause()期间离开应用程序时停止线程,并在用户返回onResume()中的应用程序时恢复线程.以下是我实现的代码,但它不起作用(onPause()和onResume()件),我不明白为什么.我已经阅读了其他类似问题的其他帖子,但他们没有帮我弄清楚在我的情况下该怎么做.我已经读过TimerTasks已经过时了,我应该使用ExecutorService方法; 我不清楚如何实现这个功能.
...timerStep5 = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (b5) {
cashButton2SignalText.setBackgroundColor(Color.RED);
cashButton2SignalText.setTextColor(Color.WHITE);
b5=false;
} else {
cashButton2SignalText.setBackgroundColor(Color.WHITE);
cashButton2SignalText.setTextColor(Color.RED);
b5=true;
}
}
});
}
};
timer5.schedule(timerStep5,250,250);
}
public void onPause(){
super.onPause();
timerStep5.cancel();
}
public void onResume(){
super.onResume();
timerStep5.run();
}
Run Code Online (Sandbox Code Playgroud) 我在网上搜索了最近2天,但我找不到任何有用的教程.我已经创建了一个服务,我在服务启动时在状态栏中发送通知.我希望该服务在显示通知后停止,并在5分钟后再次启动.如果有可能请告诉我,如果有的话,请给我一些有用的教程.我听说过,TimerTask并且AlarmManager我也尝试使用它们,但我无法获得理想的结果.
编辑:我需要每5分钟启动一次服务,即使我的应用程序没有运行.
从Java教程:
请注意,
Swing计时器的任务是在事件派发线程中执行的.这意味着任务可以安全地操作组件,但这也意味着任务应该快速执行.如果任务可能需要一段时间才能执行,那么请考虑使用SwingWorker替代或替代计时器.
"快速"是什么意思?我的意思是不准确,不到一分钟很快或者什么?
例如,如果我想用一些面板制作动画(1分钟),通过移动它们,改变它们的透明度......并且用户只是看到面板而不能使用它们(没有我/ O),现在Timer是这种情况的好主意吗?
我在我的onCreate()方法中添加了这部分代码,它崩溃了我的应用程序.需要帮忙.
logcat的:
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread
that created a view hierarchy can touch its views.
Run Code Online (Sandbox Code Playgroud)
码:
final TextView timerDisplayPanel = (TextView) findViewById(R.id.textView2);
Timer t = new Timer();
t.schedule(new TimerTask(){
public void run(){
timerInt++;
Log.d("timer", "timer");
timerDisplayPanel.setText("Time ="+ timerInt +"Sec");
}
},10, 1000);
Run Code Online (Sandbox Code Playgroud) 我有两个定时器从FIFO队列管理输入(EN-队列)和输出(离队),但我不断收到的出队java.lang.IllegalStateException一个例外:计时器已经取消.我不能停止的地方,那里的错误声称发生线路83.我不知道我错过了什么,所以任何帮助,将不胜感激调试行.
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
/**
* RunSim
*/
public class RunSim {
private double arrivalRate = 600;
private double y;
private Timer t;
private Timer t2;
private Queue fifoQueue;
private long xy;
private long fact = 10;
private int count;
private int pId;
public RunSim() {
Random r = new Random();
long n = System.currentTimeMillis();
r.setSeed(n);
double i = r.nextDouble();
y = ((1 / arrivalRate) * (Math.log(i)));
xy = (long) y;
t = new Timer();
t2 = …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Timer和TimerTask类创建一个简单的计时器.我一直收到以下错误:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
package com.austinheitmann.stopwatch;
import android.os.CountDownTimer;
import android.os.SystemClock;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends ActionBarActivity {
TextView timerf;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timerf = (TextView) findViewById(R.id.timer);
}
int i=0;
TimerTask time = new TimerTask() {
public void run() {
i++;
int …Run Code Online (Sandbox Code Playgroud) 我想澄清一下有关TimerTask的内容.如果您有以下代码:
timer.schedule(task, 60000);
Run Code Online (Sandbox Code Playgroud)
如果任务计划在接下来的1分钟内运行,那么任务对象是否已在执行?
因为在我的代码中某处我调用了task.cancel()但似乎调用并没有阻止
要执行的任务.我甚至记录了来自调用的返回值,它返回false.
当我阅读取消方法的文档时,我想到了我的问题:
取消TimerTask并将其从Timer的队列中删除.通常,如果调用没有阻止TimerTask至少运行一次,则返回false.后续调用无效.如果调用阻止了计划执行,则返回true,否则返回false.
我相信我在1分钟的延迟之前打电话给cancel().但是如何取消返回false,
是[任务]已经执行了吗?
希望你能给我提供线索/提示甚至解释.谢谢!
在我的Android应用程序中,我运行一个计时器并在其他一些事件上取消它:
class MyTimerTask extends TimerTask {
override boolean cancel() {
...
}
override void run() {
...
}
}
...
Timer t = new Timer();
t.schedule(new MyTimerTask(),...)
...
t.cancel();
Run Code Online (Sandbox Code Playgroud)
我期待t.cancel()能够自动调用MyTimerTask的cancel()方法.但是从不调用该方法.
我想知道这两种方法之间究竟有什么不同,以及为什么第二种方法不能自动调用.
我写了一个守护进程,结构如下:
while( true ) {
// do some stuff
Thread.sleep( 1000 );
}
Run Code Online (Sandbox Code Playgroud)
我注意到它使用了非常大量的CPU - 高达100%.我的生产服务器上有一个类似的守护进程已经有几个月存在相同的CPU问题了.
昨天我重构了使用TimerTask的代码.我立即注意到我的开发盒上的CPU使用率有所下降.所以我决定使用Munin部署到生产和双重检查.以下是图表:


几点:
那么:与TimerTask相比,为什么Thread.sleep效率低下?
我有一个在一个方法中运行TimerTask的服务,它必须每秒计数并在一段时间后执行某些操作.我的服务正常工作,当我启动服务中的方法时,计时器开始每隔一秒(1000毫秒)打勾.问题是,当设备屏幕关闭时,我的计时器有时停止并且计数不正确.我可以在日志文件中看到计时器停止15秒,然后运行5秒,然后再次停止...当设备连接到计算机时,计时器始终正常工作,当我从计算机断开设备时会出现此问题.
这是我的服务:
public class MyService extends Service {
private String TAG = getClass().getName();
public void count() {
Log.i(TAG, "Service Count Method Start");
int counter;
Timer mTimer = new Timer();
mTimer.schedule(new TimerTask() {
@Override
public void run() {
Log.i(TAG, "Timer count value : " + counter);
if (!someCondition) {
counter++;
if (DefaultApplication.notOnDisplayTime >= 180) {
Log.d(TAG, "APPLICATION REACHED TIME LIMIT!");
someCondition = true;
} else
someCondition = false;
} else {
counter = 0;
}
}
}, 0, 1000);
}
@Override …Run Code Online (Sandbox Code Playgroud)