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

时间:2014-01-04 06:10:09

标签: android textview

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);
}

在这里测试概念。我试图每2秒获取一个更新的当前位置并将其显示在TextView中。我设置它以便它可以执行一次,但是当我添加计时器时,它将setText一次,但下次它崩溃。有什么问题?

2 个答案:

答案 0 :(得分:1)

Timer在单独的Thread中运行,因为您无法触及非UI线程中的UI视图...

使用TextView的HandlerrunOnUiThread()

这可能对你有帮助......

 public void displayCurrentLocation() {
    mCurrentLocation = mLocationClient.getLastLocation();
    runOnUiThread(new Runnable() {

        @Override
        public void run() {
            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);

答案 1 :(得分:1)

 I am trying to get an updated current location every 2 seconds and display it in a TextView.

我的猜测(基于上面的评论)是你正在从Timer任务更新ui。计时器任务在不同的线程上运行。你无法从中更新ui。你需要从ui线程更新ui。

使用HandlerrunOnUiThread

 runOnUiThread(new Runnable() {
    public void run() {
     // update ui here
    }
});

Handler是更好的选择。

http://developer.android.com/reference/android/os/Handler.html

当你创建一个新的Handler时,它被绑定到正在创建它的线程的线程/消息队列 - 从那时起,它将消息和runnables传递给该消息队列并在它们出现时执行它们消息队列。

因此,如果您在ui线程上创建处理程序,它就会绑定到它,您可以在那里更新ui。

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