Android setText在第二次实现后导致崩溃?

Android setText在第二次实现后导致崩溃?,android,textview,Android,Textview,只是在这里测试概念。我正在尝试每2秒获取一个更新的当前位置,并在文本视图中显示它。我将其设置为只执行一次,但当我添加计时器时,它将设置一次,但下次它崩溃时。怎么了?计时器在一个单独的线程中运行,因为您不能在非UI线程中触摸UI视图 使用TextView或runOnUiThread的处理程序 这可能会帮助你 public void displayCurrentLocation(){ mCurrentLocation=mLocationClient.getLastLocation();

只是在这里测试概念。我正在尝试每2秒获取一个更新的当前位置,并在文本视图中显示它。我将其设置为只执行一次,但当我添加计时器时,它将设置一次,但下次它崩溃时。怎么了?

计时器在一个单独的线程中运行,因为您不能在非UI线程中触摸UI视图

使用TextView或runOnUiThread的处理程序

这可能会帮助你

public void displayCurrentLocation(){
    mCurrentLocation=mLocationClient.getLastLocation();
    TextView coordinates = (TextView)findViewById(R.id.coordinates);
    coordinates.setText(mCurrentLocation.getLatitude()+", "+mCurrentLocation.getLongitude());
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            displayCurrentLocation();
        }
    }, 2000);
}
根据上面的评论,我猜测您正在从计时器任务更新ui。计时器任务在不同的线程上运行。您无法从中更新ui。您需要从ui线程更新ui

使用处理程序或runOnUiThread

处理程序是一个更好的选择

当您创建一个新的处理程序时,它被绑定到正在创建它的线程的线程/消息队列-从那时起,它将向该消息队列传递消息和可运行文件,并在它们从消息队列中出来时执行它们

所以,如果您在ui线程上创建处理程序,它将绑定到它,您可以在那里更新ui

 runOnUiThread(new Runnable() {
    public void run() {
     // update ui here
    }
});
取消跑步

Handler m_handler;
Runnable m_handlerTask ; 
int timeleft=100;
m_handler = new Handler(); 
m_handlerTask = new Runnable() 
{ 
@Override
public void run() {
      // do something
  m_handler.postDelayed(m_handlerTask, 2000); 
 }
 };
 m_handlerTask.run();

请粘贴您的logcat错误..displayCurrentLocation的邮政编码;无论出于何种原因,这只会更新坐标一次,或者该值不会更改。
 runOnUiThread(new Runnable() {
    public void run() {
     // update ui here
    }
});
Handler m_handler;
Runnable m_handlerTask ; 
int timeleft=100;
m_handler = new Handler(); 
m_handlerTask = new Runnable() 
{ 
@Override
public void run() {
      // do something
  m_handler.postDelayed(m_handlerTask, 2000); 
 }
 };
 m_handlerTask.run();
  m_handler.removeCallbacks(m_handlerTask); // cancel run