1

如何确保代码在 Android MapActivity 项目的 UI 线程上执行或不执行?

我正在开发一个基于 Android 地图的应用程序,但我遇到了一些稳定性问题,我的研究使我相信我需要确保在 UI 线程上执行屏幕更新。

我的应用程序有来自 GPS 侦听器(我想将其配置为单独的线程)和 UDP 侦听器(已经是单独的线程)的数据,并且它具有通常的一组 android 软件生命周期方法,但我一定是没有经验之类的,因为我不知道在哪里放置更新地图覆盖的代码

(a) 在 UI 线程上,(b) 以重复的方式。

我对轮询或事件驱动的过程(可能基于计时器,或传入数据的到达)没有偏好,因此任何一种类型的建议都将被欣然接受。

任何人有任何想法?

谢谢,R。

4

3 回答 3

0

阅读有关无痛线程的这篇文章,尤其是Activity.runOnUIThread

于 2010-10-01T14:24:17.250 回答
0

您还可以查看在 UI 线程中处理昂贵的操作。在您的情况下,您可以执行以下操作:

公共类 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 
    [ . . . ]
}

}

于 2010-10-01T15:15:05.227 回答
0

android 位置服务是一个在后台运行的模块,因此您无需将其分离到另一个线程中。

但是,我根本不建议您使用 java 线程类或可运行接口,而是使用异步任务来为您执行所有线程管理。看看 android 开发者博客Painless Threading

要在位置更新上更新您的 UI 线程,您可以使用更新处理程序。每次有可用的 GPS 数据时,都会向主 ui 线程中的更新处理程序传输一条消息。

例如

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);
        }
    };
于 2010-10-01T15:43:05.483 回答