Java 不幸的是,应用程序名称已停止

Java 不幸的是,应用程序名称已停止,java,android,Java,Android,我是Java新手,我正在尝试使用eclipse和插件为Android编写一个简单的应用程序。 代码如下: package com.example.pushthebutton; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.widget.TextV

我是Java新手,我正在尝试使用eclipse和插件为Android编写一个简单的应用程序。 代码如下:

package com.example.pushthebutton;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {
    int counter = 30;
    TextView label;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        int delay = 0; 
        int period = 1000;
        Timer timer = new Timer();
        label = (TextView) findViewById(R.id.textView1);
        timer.scheduleAtFixedRate(new TimerTask() {
                public void run() {
                    label.setText(String.valueOf("Time left: "));
                    counter--;
                }
            }, delay, period);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}
在模拟器中运行它之后,它说:不幸的是,app name已经停止了。 日志:


我是Java新手。。我不知道它可能是什么。

您不能从与UI线程不同的线程更新每个视图:

以这种方式更改代码:

timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {

                runOnUiThread(new Runnable()
                    public void run() {
                        label.setText(String.valueOf("Time left: "));
                        counter--;
                        }
                  ));

            }
        }, delay, period);
}
通过这种方式,您要求Android在UI线程上执行setText调用

例外只有创建视图层次结构的原始线程才能接触其视图

你不能这样做

label.setText(String.valueOf("Time left: "));
runOnUiThread(new Runnable() {
   public void run() {
      //Update UI Here
   }
});
像这样做

label.setText(String.valueOf("Time left: "));
runOnUiThread(new Runnable() {
   public void run() {
      //Update UI Here
   }
});
或处理程序来执行此操作

实例 试试这个:

 timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                runOnUiThread(new Runnable() {
                @Override
        public void run() {
        label.setText(String.valueOf("Time left: "));
                    counter--;
        }
            }
          }
        }, delay, period);

您正在从非UI线程(即计时器)修改UI线程。

谢谢:您能给我举个例子吗?像个魔咒一样工作:。接受:谢谢!您不需要使用String.valueOfTime left:。时间还剩:已经是一根弦了。@Unholy Sampler是的,我当时不知道runOnUiThread的事,所以我想我应该投下它或者别的什么。