在Android中使用Looper.prepare()的细节

ath*_*aos 6 multithreading android looper

我在理解如何使用Looper prepare()/ loop()/ quit()逻辑方面遇到了一些麻烦.

我有三个线程:一个是UI线程,一个是游戏逻辑线程,最后一个是网络通信线程(后台线程,只在使用时生存).

游戏线程对网络调用的结果有很多依赖性,所以我想从游戏线程中旋转网络线程Handler并将结果发回.

当然,由于没有涉及UI线程,我需要在Looper.prepare()某个地方调用... 我认为它应该在游戏线程中调用,但我不能这样做,因为loop()接管它.

如何使用我的处理程序从网络线程回发到游戏线程?

cyn*_*gus 7

这是怎么回事是,一旦你在一个线程调用Looper.prepare(),其次是Looper.loop(),所有的线程将永远做的是服务其的MessageQueue,直到有人叫退出()在它的活套.

要实现的另一件事是,默认情况下,当一个Handler被实例化时,它的代码将始终在它创建的Thread上执行

你应该做的是创建一个新的Thread并在run()中调用Looper.prepare(),设置任何Handler,然后调用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
    }
}
Run Code Online (Sandbox Code Playgroud)