6

Looper prepare()//ロジックの使用方法を理解するのに少し苦労していますloop()quit()

スレッドは 3 つあります。1 つは UI スレッド、もう 1 つはゲーム ロジック スレッド、最後はネットワーク通信スレッドです (バックグラウンド スレッドで、使用中のみ存続します)。

ゲーム スレッドは、ネットワーク呼び出しの結果に多くの依存関係を持っているため、ネットワーク スレッドをゲーム スレッドから切り離して、結果をポストバックしたいと考えましたHandler

もちろん、UI スレッドは関与していないので、Looper.prepare()どこかで ... を呼び出す必要があります。ゲームスレッドで呼べばいいのにと思ったのですloop()が、乗っ取ってしまうのでできません。

ハンドラーを使用してネットワーク スレッドからゲーム スレッドにポストバックするにはどうすればよいですか?

4

2 に答える 2

7

スレッドでLooper.prepare()を呼び出してからLooper.loop()を呼び出すと、誰かがLooperでquit()を呼び出すまで、Threadが実行するのはMessageQueueを処理することだけです。

もう1つの注意点は、デフォルトでは、ハンドラーがインスタンス化されると、そのコードは作成されたスレッドで常に実行されるということです。

新しいスレッドを作成し、run()でLooper.prepare()を呼び出し、ハンドラーをセットアップしてから、Looper.loop()を呼び出す必要があります。

ここでこれらのことを念頭に置いて、私が多くの場所で使用する基本的なパターンです。また、代わりにAsyncTaskを使用する必要がある可能性があります。

public class NetworkThread extends Thread {
    private Handler mHandler;
    private Handler mCallback;
    private int QUIT = 0;
    private int DOWNLOAD_FILE = 1;
    public NetworkThread(Handler onDownloaded) {
        mCallback = onDownloaded;
    }

    public void run() {
        Looper.prepare();
        mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    // things that this thread should do
                    case QUIT:
                        Looper.myLooper().quit();
                        break;
                    case DOWNLOAD_FILE:
                        // download the file
                        mCallback.sendMessage(/*result is ready*/);
                }
            }
        }
        Looper.loop();
    }

    public void stopWorking() {
        // construct message to send to mHandler that causes it to call 
        // Looper.myLooper().quit
    }

    public void downloadFile(String url) {
        // construct a message to send to mHandler that will cause it to
        // download the file
    }
}
于 2011-07-21T23:20:01.360 に答える