我正在尝试使用基本计时器在Android上工作,我在onCreate()方法中有以下代码:
editText = (EditText) findViewById(R.id.edit_message);
Timer time = new Timer();
time.schedule(new TimerTask() {
public void run() {
timesince++;
editText.setText("Timeran:"+timesince);
Log.d("TIMER", "TimerTask run");
}}, 0, 1000);
所以希望它会以更高的值(timesince)更新文本框 - 它在程序的顶部声明,以及editText ......
然而,(虽然我没有编译问题)当我在模拟器上运行它时根本不起作用。 App说'blahblahblah已停止工作......'
我做错了吗?我错过了什么?
非常感谢。
(如果删除此代码,P.S.App工作正常,因此我知道此部分存在问题。)
编辑:我相信这是我的logcat输出,对不起文字墙:
10-11 03:40:49.260: E/AndroidRuntime(561): FATAL EXCEPTION: Timer-0
10-11 03:40:49.260: E/AndroidRuntime(561): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
10-11 03:40:49.260: E/AndroidRuntime(561): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:3939)
10-11 03:40:49.260: E/AndroidRuntime(561): at android.view.ViewRootImpl.invalidateChild(ViewRootImpl.java:714)
10-11 03:40:49.260: E/AndroidRuntime(561): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:763)
10-11 03:40:49.260: E/AndroidRuntime(561): at android.view.ViewGroup.invalidateChild(ViewGroup.java:4012)
10-11 03:40:49.260: E/AndroidRuntime(561): at android.view.View.invalidate(View.java:8454)
10-11 03:40:49.260: E/AndroidRuntime(561): at android.widget.TextView.invalidateCursor(TextView.java:4319)
10-11 03:40:49.260: E/AndroidRuntime(561): at android.widget.TextView.spanChange(TextView.java:7670)
10-11 03:40:49.260: E/AndroidRuntime(561): at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:8020)
10-11 03:40:49.260: E/AndroidRuntime(561): at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:898)
10-11 03:40:49.260: E/AndroidRuntime(561): at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:614)
10-11 03:40:49.260: E/AndroidRuntime(561): at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:520)
10-11 03:40:49.260: E/AndroidRuntime(561): at android.text.Selection.setSelection(Selection.java:76)
10-11 03:40:49.260: E/AndroidRuntime(561): at android.text.Selection.setSelection(Selection.java:87)
10-11 03:40:49.260: E/AndroidRuntime(561): at android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:302)
10-11 03:40:49.260: E/AndroidRuntime(561): at android.widget.TextView.setText(TextView.java:3244)
10-11 03:40:49.260: E/AndroidRuntime(561): at android.widget.TextView.setText(TextView.java:3110)
10-11 03:40:49.260: E/AndroidRuntime(561): at android.widget.EditText.setText(EditText.java:78)
10-11 03:40:49.260: E/AndroidRuntime(561): at android.widget.TextView.setText(TextView.java:3085)
10-11 03:40:49.260: E/AndroidRuntime(561): at com.example.cultivation.MainActivity$1.run(MainActivity.java:54)
10-11 03:40:49.260: E/AndroidRuntime(561): at java.util.Timer$TimerImpl.run(Timer.java:284)
答案 0 :(得分:3)
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
这是问题
您必须将更新ui的后台任务部分移动到主线程或在UI线程中创建mHandler;
<强>更新强>
从计时器更新用户界面:http://android-developers.blogspot.com/2007/11/stitch-in-time.html
答案 1 :(得分:2)
或使用handler来运行更新textview:
private final Runnable mRunnable1 = new Runnable() {
public void run() {
timesince++;
editText.setText("Timeran:"+timesince);
Log.d("TIMER", "TimerTask run");
mHandler.postDelayed(mRunnable1, 1000);
}
};
并在OnCreate()
方法mHandler.postDelayed(mRunnable1, 1000);
答案 2 :(得分:0)
尝试从UI线程更新TextView
。尝试使用处理程序。在这里你可以找到一篇很好的文章。 Update textview with the help of Handler
答案 3 :(得分:0)
执行以下操作:
将Timer声明为全局变量,并按如下方法调用timer函数:
public void startThread(){
time.schedule(new TimerTask() {
public void run() {
timesince++;
editText.setText("Timeran:"+timesince);
Log.d("TIMER", "TimerTask run");
}}, 0, 1000);
}
并在startThread()
onCreate()
函数