如何确保Android MapActivity项目中的UI线程上执行或未执行代码?
我正在开发基于Android地图的应用程序,但我遇到了一些稳定性问题,而且我的研究让我相信我需要确保在UI线程上执行屏幕更新。
我的应用程序有来自GPS监听器(我想配置为单独的线程)和UDP监听器(已经是一个单独的线程)的数据,并且它具有通常的一组android软件生命周期方法,但我必须缺乏经验或其他什么,因为我不知道在哪里放置更新地图叠加层的代码
(a)在UI线程上, (b)以经常性方式。
我在轮询或事件驱动的流程(可能是基于计时器或传入数据的到达)之间没有偏好,因此将非常感谢任何类型的建议。
任何人有任何想法吗?
谢谢, R上。
答案 0 :(得分:0)
在painless threading上阅读此帖子,尤其是Activity.runOnUIThread
答案 1 :(得分:0)
您还可以查看此Handling Expensive Operations in UI Thread。在您的情况下,您可以执行以下操作:
公共类MyActivity扩展了Activity {
[ . . . ]
// Need handler for callbacks to the UI thread
final Handler mHandler = new Handler();
// Create runnable for posting
final Runnable mUpdateResults = new Runnable() {
public void run() {
updateResultsInUi();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setup location listener
[ . . . ]
startNonUIThread();
}
protected void startNonUIThread() {
// Fire off a thread to do some work that we shouldn't do directly in the UI thread
Thread t = new Thread() {
public void run() {
try{
while(true){
sleep(1000);
mHandler.post(mUpdateResults);
}
}catch(InterruptedException e){
//blah blah
}
}
};
t.start();
}
private void updateResultsInUi() {
// Back in the UI thread -- update UI elements based on data from locationlistener
//get listener location
//use the location to update the map
[ . . . ]
}
}
答案 2 :(得分:0)
android位置服务是一个在后台运行的模块,所以你不需要在另一个线程中分离它。
但是我不建议您完全使用java线程类或runnable接口,而是使用异步任务来执行所有线程管理。看一下android开发人员博客Painless Threading。
要更新位置更新的UI线程,您可以使用更新handlers。每当有可用的GPS数据时,消息就会传送到你主要ui线程中的更新处理程序。
E.g。
public void onLocationChanged(Location location) {
location = this.lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
try {
this.mLongitude = location.getLongitude();
this.mLatitude = location.getLatitude();
Message msg = Message.obtain();
msg.what = UPDATE_LOCATION;
this.SystemService.myViewUpdateHandler.sendMessage(msg);
} catch (NullPointerException e) {
Log.i("Null pointer exception " + mLongitude + "," + mLatitude, null);
}
}
在您的主要活动课程中:
Handler myViewUpdateHandler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE_LOCATION:
//do something
}
super.handleMessage(msg);
}
};