【发布时间】:2015-11-16 17:27:57
【问题描述】:
我有这个 Runnable 计时器线程:
private Runnable updateTimerThreadRecording = new Runnable() {
public void run() {
timeInMilliseconds = SystemClock.uptimeMillis() - startTime;
updatedTime = timeSwapBuff + timeInMilliseconds;
int secs = (int) (timeInMilliseconds / 1000);
int mins = secs / 60;
secs = secs % 60;
int hours = mins / 60;
mins = mins % 60;
String timer = "Recording Time: " + String.format("%02d", hours) + ":" + String.format("%02d", mins) + ":" + String.format("%02d", secs);
timerValueRecord.setText(timer);
customHandler.postDelayed(this, 1000);
}
};
我添加的是:“录制时间:” 字符串计时器的原行是:
String timer = "" + String.format("%02d", hours) + ":" + String.format("%02d", mins) + ":" + String.format("%02d", secs);
但是由于我添加了录制时间: 我得到了这个例外。我尝试在“%02d”之前的 String.format 中添加此文本,但同样的例外。
没有它作为原始行也不例外。 没有我添加的文本,它运行良好,我看到的是:00:00:00,它正在计算秒数。但我现在想添加一个文本,使其在 timerValueRecord TextView 上看起来像这样: Recording Time: 00:00:00
这是 Logcat:
11-16 19:18:46.505 20569-20753/com.test.webservertest E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-2723
Process: com.test.webservertest, PID: 20569
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6334)
at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:890)
at android.view.View.requestLayout(View.java:17407)
at android.view.View.requestLayout(View.java:17407)
at android.view.View.requestLayout(View.java:17407)
at android.view.View.requestLayout(View.java:17407)
at android.view.View.requestLayout(View.java:17407)
at android.view.View.requestLayout(View.java:17407)
at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:360)
at android.view.View.requestLayout(View.java:17407)
at android.widget.TextView.checkForRelayout(TextView.java:7054)
at android.widget.TextView.setText(TextView.java:4186)
at android.widget.TextView.setText(TextView.java:4044)
at android.widget.TextView.setText(TextView.java:3999)
at com.test.webservertest.MainActivity$1.run(MainActivity.java:230)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at com.test.webservertest.MainActivity$3.run(MainActivity.java:272)
at java.lang.Thread.run(Thread.java:818)
【问题讨论】:
-
你不能使用线程来更新用户界面。所以
Timer/TimerTask、原始Thread以及任何创建线程的东西都是禁忌。幸运的是,重复的任务不需要线程:guides.codepath.com/android/Repeating-Periodic-Tasks#handler 或使用CountDownTimer并将millisInFuture设置为Long.MAX_VALUE,这样它就永远不会用完。
标签: android