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

Android 位置情報サービスはバックグラウンドで実行されるモジュールであるため、別のスレッドで分離する必要はありません。

ただし、Java スレッド クラスまたは実行可能なインターフェイスを使用することはお勧めしません。代わりに、すべてのスレッド管理を実行する async タスクを使用してください。Android 開発者のブログ、Painless Threadingをご覧ください。

場所の更新時に UI スレッドを更新するには、 update handlersを使用できます。利用可能な 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 に答える
0

このUI スレッドでの高価な操作の処理も参照してください。あなたの場合、次のことができます:

public class MyActivity extends 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 に答える