Android计时器更新文本视图(UI)

听闻少年二字,当与平庸相斥。这篇文章主要讲述Android计时器更新文本视图(UI)相关的知识,希望能为你提供帮助。
我正在使用计时器来制作秒表。计时器通过增加整数值来工作。我想通过不断更新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); }

关于在错误的线程中更新UI,我遇到了一些错误。
如何调整我的代码来完成不断更新textview的任务?
答案
protected static void startTimer() { isTimerRunning = true; timer.scheduleAtFixedRate(new TimerTask() { public void run() { elapsedTime += 1; //increase every sec mHandler.obtainMessage(1).sendToTarget(); } }, 0, 1000); }public Handler mHandler = new Handler() { public void handleMessage(Message msg) { StopWatch.time.setText(formatIntoHHMMSS(elapsedTime)); //this is the textview } };

上面的代码将工作...
【Android计时器更新文本视图(UI)】注意:必须在主线程中创建处理程序,以便您可以修改UI内容。
另一答案您应该使用Handler来每隔X秒更新一次UI。这是另一个展示示例的问题:Repeat a task with a time delay?
您的方法不起作用,因为您尝试从非UI线程更新UI。这是不允许的。
另一答案
StopWatch.time.post(new Runnable() { StopWatch.time.setText(formatIntoHHMMSS(elapsedTime)); });

此代码块基于Handler,但您不需要创建自己的Handler实例。
另一答案TimerTask实现了Runnable,这将使它成为一个线程。如果没有一些工作,您无法直接从其他线程更新主UI线程。您可以做的一件事是使用Async Task创建计时器并每秒发布一次更新UI的更新。
另一答案我假设StopWatch.time是对TextView的一些静态或公共引用。而不是这样做,你应该实现一个BroadcastReceiver来在你的计时器(从一个单独的线程运行)和你的TextView之间进行通信。
另一答案您可以使用以下实用程序:
/** * Created by Ofek on 19/08/2015. */ public class TaskScheduler extends Handler { private ArrayMap< Runnable,Runnable> tasks = new ArrayMap< > (); public void scheduleAtFixedRate(final Runnable task,long delay,final long period) { Runnable runnable = new Runnable() { @Override public void run() { task.run(); postDelayed(this, period); } }; tasks.put(task, runnable); postDelayed(runnable, delay); } public void scheduleAtFixedRate(final Runnable task,final long period) { Runnable runnable = new Runnable() { @Override public void run() { task.run(); postDelayed(this, period); } }; tasks.put(task, runnable); runnable.run(); } public void stop(Runnable task) { Runnable removed = tasks.remove(task); if (removed!=null) removeCallbacks(removed); }}

然后,在由UI线程运行的代码中的任何地方,您都可以像这样使用它:
TaskScheduler timer = new TaskScheduler(); timer.scheduleAtFixedRate(new Runnable() { @Override public void run() { time.setText(simpleDateFormat.format(GamePlay.instance().getLevelTime())); } },1000);

另一答案你可以使用Handler。
此代码每隔一秒增加一个计数器,并在textView上显示和更新计数器值。
public class MainActivity extends Activity {private Handler handler = new Handler(); private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.text); startTimer(); }int i = 0; Runnable runnable = new Runnable() { @Override public void run() { i++; textView.setText("counter:" + i); startTimer(); } }; public void startTimer() { handler.postDelayed(runnable, 1000); }public void cancelTimer() { handler.removeCallbacks(runnable); }@Override protected void onStop() { super.onStop(); handler.removeCallbacks(runnable); } }

另一答案
timer.schedule(new TimerTask() { @Override public void run() {//your actions} },1*1000); //1 sec


    推荐阅读