我查看了代码here以及代码here,但我仍然无法让我的代码正常工作。使用第二个链接,我可以获得一个在页面上计数的“计时器”,但是第一个,我的UI锁定。我想要做的是有一个单独的线程,只要应用程序打开,它就会每3秒钟在文本切换器中不断翻转文本。我需要它在两个值之间切换,并尝试过以下内容:
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
while(true){
try {
mHandler.post(new Runnable(){
@Override
public void run() {
try {
mSwitcher.setText("ON");
Thread.sleep(1000);
mSwitcher.setText("OFF");
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
);
}catch (Exception e) {
//tv1.setText(e.toString());
}
}
}
};
每2秒钟会“开启”或“关闭”。我还需要能够从主UI更新文本切换器内容,但还没有达到我可以尝试测试的程度。除了上述内容之外,我还尝试使用异步任务:
new AsyncTask<Void, Double, Void>() {
@Override
protected Void doInBackground(Void... params) {
while (true) {
mSwitcher.setText("ON");
SystemClock.sleep(2000);
mSwitcher.setText("OFF");
SystemClock.sleep(2000);
}
}
}.execute();
但这也不起作用。
答案 0 :(得分:5)
另一种更简单的方法是使用viewFlipper
而不是viewSwitcher
。这允许您单独使用XML布局执行所需的所有操作:
<ViewFlipper
android:id="@+id/viewFlipper1"
android:autoStart="true"
android:flipInterval="3000">
<TextView
android:id="@+id/on_textview"
android:text="ON" />
<TextView
android:id="@+id/off_textview"
android:text="OFF" />
</ViewFlipper>
为了让它看起来更漂亮,您还可以定义要在viewFlipper
中使用的动画:
<ViewFlipper
android:id="@+id/viewFlipper1"
android:autoStart="true"
android:flipInterval="3000"
android:inAnimation="@android:anim/fade_in"
android:outAnimation="@android:anim/fade_out">
答案 1 :(得分:2)
尝试使用timer:
Timer timer = new Timer("desired_name");
timer.scheduleAtFixedRate(
new TimerTask() {
public void run() {
//switch your text using either runOnUiThread() or sending alarm and receiving it in your gui thread
}
}, 0, 2000);
Reference for runOnUiThread。您无法从非ui线程更新gui元素,因此尝试从doInBackground()
AsyncTask
方法更新它将导致错误。
答案 2 :(得分:1)
Timer t = new Timer();
TimerTask scanTask = new TimerTask() {
public void run() {
mHandler.post(new Runnable() {
public void run() {
mSwitcher.setText(isOn ? "ON" : "OFF");
isOn = isOn? false : true;
}
});
}};
t.schedule(scanTask, 0, 2000);
答案 3 :(得分:0)
我更改了UI,使用了处理程序。使处理程序变量对Activity是私有的,并调用handler.sendEmptyMessage()。
您可以使用线程或异步任务来调用Handler.sendEmptyMessage(ON / OFF)。
另一种方法是使用Handler.sendEmptyMessageDelayed()。每次用户设置延迟值后,此处理程序将调用自身。