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一次,但下次它崩溃。有什么问题?
答案 0 :(得分:1)
Timer
在单独的Thread
中运行,因为您无法触及非UI线程中的UI视图...
使用TextView的Handler
或runOnUiThread()
这可能对你有帮助......
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。
使用Handler
或runOnUiThread
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