我有一个视图,我需要每隔X秒更改一次颜色。
我想决定何时可以启动和停止计时器。
必须在后台完成此操作才能阻止UI线程。
答案 0 :(得分:2)
@BaptisteM,而不是使用AsyncTask,你可以像这样使用Handler和Runnable,
{{1}}
答案 1 :(得分:1)
试试这个你可以使用TimerTask
: - >可以通过计时器安排一次或重复执行的任务。
Timer timer;
timer = new Timer();
timer.scheduleAtFixedRate(new RemindTask(), 0, 3000); // delay*/
private class RemindTask extends TimerTask
{
int current = viewPager.getCurrentItem();
@Override
public void run() {
runOnUiThread(new Runnable() {
public void run() {
coloredTextView.setTextColor(getRanColor());
}
});
}
}
答案 2 :(得分:0)
有人提出这个问题,我开始回答这个问题,但主持人关闭了它,所以我把我的例子放在这里。
此示例每1000ms随机更改一次TextView的颜色。 间隔可以改变。
package com.your.package;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
TextView coloredTextView;
long interval = 1000; //in ms
boolean timerOn = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
coloredTextView = (TextView) findViewById(R.id.colorTextView);
startColorTimer();
}
private void startColorTimer(){
new ColorTimer().execute();
timerOn=true;
}
private void stopColorTimer(){
timerOn=false;
}
private class ColorTimer extends AsyncTask<Void, Void, Void> {
public ColorTimer() {
timerOn=true;
}
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(interval);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
coloredTextView.setTextColor(getRanColor());
if(timerOn) new ColorTimer().execute();
}
private int getRanColor() {
Random rand = new Random();
return Color.argb(255, rand.nextInt(256), rand.nextInt(256), rand.nextInt(256));
}
@Override
protected void finalize() throws Throwable {
super.finalize();
timerOn=false;
}
}
}
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="fr.rifft.bacasable.MainActivity">
<TextView
android:id="@+id/colorTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:text="Colored Text View"
android:textSize="30sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
我希望它可以提供帮助。
答案 3 :(得分:0)
您可以使用Handler类: https://developer.android.com/reference/android/os/Handler.html#postDelayed(java.lang.Runnable,长)
postHandler()计算背景上的时间,并在事件发生时将事件发送到主线程。
此外,您可以使用并发: https://en.wikipedia.org/wiki/Recursion_(computer_science)
final int[] colors = new int[]{
0xFF0000FF,
0xFF00FF00,
0xFFFF0000,
0xFFFF00FF,
};
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
findViewById(R.id.bg_to_change).setBackgroundColor(colors[new Random().nextInt(colors.length)]);
handler.postDelayed(this, 500);
}
}, /*This is your X*/ 500);
答案 4 :(得分:0)
您可以使用TimerTask来执行此操作。
从onResume()
启动计时器@Override
public void onResume() {
super.onResume();
startColor();
}
并从onStop()
停止计时器@Override
public void onStop() {
super.onStop();
if (timer != null)
timer.cancel();
if (task != null)
task.cancel();
}
并将以下代码添加到您的活动中。
TimerTask task;
Timer timer;
private void startColor() {
task = new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
coloredTextView.setBackgroundColor(getRanColor());
}
});
}
private int getRanColor() {
Random rand = new Random();
return Color.argb(255, rand.nextInt(256), rand.nextInt(256), rand.nextInt(256));
}
};
timer = new Timer();
timer.scheduleAtFixedRate(task, 0, 1000);
}
答案 5 :(得分:0)
你可以这样做:
Handler mHandler = new Handler();
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
mHandler.post(new Runnable() {
@Override
public void run() {
//change color
}
});
}
}, 0, 5* 1000); // 5s
通过以下方式阻止它:
timer.cancel();