Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android简单计时器/计时器任务问题_Android_Timer_Timertask - Fatal编程技术网

Android简单计时器/计时器任务问题

Android简单计时器/计时器任务问题,android,timer,timertask,Android,Timer,Timertask,我正在尝试让一个基本的计时器在Android上工作,我在onCreate()方法中有以下代码: 所以希望它能用一个递增的值(timesince)来更新文本框,这个值和editText一起在程序顶部声明 然而,(尽管我没有遇到编译问题),当我在模拟器上运行它时,它根本不工作。应用程序显示“blahblahblah已停止工作…” 我做错计时器了吗?我错过了什么 非常感谢 (如果删除此代码,p.S.应用程序工作正常,因此我知道此部分存在问题。) 编辑:我相信这是我的logcat输出,很抱歉出现了文字墙

我正在尝试让一个基本的计时器在Android上工作,我在onCreate()方法中有以下代码:

所以希望它能用一个递增的值(timesince)来更新文本框,这个值和editText一起在程序顶部声明

然而,(尽管我没有遇到编译问题),当我在模拟器上运行它时,它根本不工作。应用程序显示“blahblahblah已停止工作…”

我做错计时器了吗?我错过了什么

非常感谢

(如果删除此代码,p.S.应用程序工作正常,因此我知道此部分存在问题。)

编辑:我相信这是我的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)
这就是问题所在

您必须将更新ui的后台任务部分移动到主线程上,或者在ui线程中创建mHandler

更新:


从计时器更新UI:

尝试从UI线程更新
TextView
。尝试使用处理程序。在这里你可以找到一篇关于这个的好文章

执行以下操作:

   public void startThread(){
    time.schedule(new TimerTask() {
    public void run() {
        timesince++;
        editText.setText("Timeran:"+timesince);
        Log.d("TIMER", "TimerTask run");
    }}, 0, 1000);
    }
将Timer声明为全局变量,并使用如下方法调用Timer函数:

   public void startThread(){
    time.schedule(new TimerTask() {
    public void run() {
        timesince++;
        editText.setText("Timeran:"+timesince);
        Log.d("TIMER", "TimerTask run");
    }}, 0, 1000);
    }

并在
onCreate()

中调用此
startThread()
函数,或使用处理程序运行更新文本视图:

     private final Runnable mRunnable1 = new Runnable() {

     public void run() {
        timesince++;
        editText.setText("Timeran:"+timesince);
        Log.d("TIMER", "TimerTask run");

 mHandler.postDelayed(mRunnable1, 1000);
 }

 };

并在
OnCreate()
method
mHandler.postDelayed(mrunable11000)中调用这一行

对不起,我真的不知道那是什么意思;我以为main.java上的onCreate()会是主线程的一部分-那么我应该把这个计时器代码放在哪里呢?
     private final Runnable mRunnable1 = new Runnable() {

     public void run() {
        timesince++;
        editText.setText("Timeran:"+timesince);
        Log.d("TIMER", "TimerTask run");

 mHandler.postDelayed(mRunnable1, 1000);
 }

 };