Android MapActivity线程问题

时间:2010-10-01 14:21:21

标签: android multithreading ui-thread

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

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

我的应用程序有来自GPS监听器(我想配置为单独的线程)和UDP监听器(已经是一个单独的线程)的数据,并且它具有通常的一组android软件生命周期方法,但我必须缺乏经验或其他什么,因为我不知道在哪里放置更新地图叠加层的代码

(a)在UI线程上,    (b)以经常性方式。

我在轮询或事件驱动的流程(可能是基于计时器或传入数据的到达)之间没有偏好,因此将非常感谢任何类型的建议。

任何人有任何想法吗?

谢谢, R上。

3 个答案:

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