0

2 つの Android フォン間のソケット接続を実装しました。自作の地図に位置を表示したいので、ローカル電話はいくつかのビュー要素を更新する必要があります。

Android プログラミング ガイドラインは、View 要素を自分のアクティビティの外から変更することを承認していません。つまり、次のようなメソッドを呼び出すことはできません。

mainActivity.updateView(positionX);

ネットワークスレッドで実行するためです。それで、それを行う公式の方法は何ですか?runOnUIThreadがあることは知っていますが、それは一見するとクイックフィックスのように見えます。

または、AsyncTask が必要ですか? しかし、API によると、より長いタスクには実用的ではなく、スレッドを常にバックグラウンドで実行する (そして頻繁に更新を取得する) 必要があります。

新しい Handler/AsyncTask を作成して、MainActivity の別の場所に小さなアイコンを簡単に設定するのは大きなことではありませんか? 結局のところ、おそらく 1 秒あたり 50 回の変更があると思います。

うまくいけば、ここの誰かがこれを行う正しい方法を知っています。ありがとう!

PS では、onDraw メソッドのようなものを上書きするオプションが少なくともある場合は、お尋ねさせてください。結局のところ、常に新しいスレッドを作成するのは少しやり過ぎに思えるので、それは最良のアイデアのように思えます。そこで、「redraw()」メソッドに、ネットワーク スレッドに保存 (同期) した情報を取得するよう伝えたいと思います。したがって、これ以上のスレッドは必要ありません。誰かそれについて何か知っていますか?ありがとうございました!

4

4 に答える 4

2

アクティビティへの参照がある場合は、次のようにUIスレッドでコードを実行できます。

    Activity activity = getActivity();
    activity.runOnUiThread (new Runnable() {
                            @Override
                            public void run() {
                                //UI thread code here
                            }
                        });

個人的には、AsyncTaskを使用します。これは、クラスが新しいスレッドの作成とそのライフサイクルの管理のプロセスを最適化するためにさらに多くのことを行うためです。AsyncTaskでは、UIコードをonPostExecute()メソッドに入れるだけです。

于 2012-08-13T15:20:27.213 に答える
2

ハンドラーを使用する必要があります。ハンドラーは、必要なことを行うための優れた方法です。次のようにアクティビティにハンドラーを実装する必要があります。

private class NetworkHandler extends Handler {

    @Override
    public void handleMessage(Message msg) {
        Bundle data = msg.getData();
        int message = data.getInt("message");
        switch (message) {


        case Network.NET_GAME_FINISHED: UPDATE YOUR UI
                                                    break;
                    case ...
                    }
             }
}

ネットワークから何かを受け取ると、そのハンドラーにメッセージを送信するだけです。

このチュートリアルを見てください。

それが役に立てば幸い!

于 2012-08-13T15:16:36.577 に答える
1

アクティビティを登録してインテントを受信し、ネットワーク スレッドで実行されているコードがインテントをブロードキャストできるようにすることをお勧めします。

于 2012-08-13T15:10:56.557 に答える
1

ソケットを処理するサービスを使用し (バックグラウンドで実行できる長時間実行されるタスクであるため)、ハンドラーとメッセージを使用して UI とサービスの間の通信を実装する (または、サービスと別のサービスへのAIDLインターフェイスを使用する可能性があります)あなたのUIに向けて、しかしそれはより複雑になるでしょう)?

于 2012-08-13T15:12:14.923 に答える