gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:52:19 27 4
gpt4 key购买 nike

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

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

游戏线程对网络调用的结果有很多依赖性,所以我想将网络线程从游戏线程中分离出来,并让 Handler 将结果发回。

当然,由于不涉及 UI 线程,我需要在某处调用 Looper.prepare()...。我认为它应该在游戏线程中调用,但我不能那样做,因为 loop() 接管了它。

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

最佳答案

发生的事情是,一旦您在 Thread 上调用 Looper.prepare() 后跟 Looper.loop(),Thread 将永远做的就是为其 MessageQueue 提供服务,直到有人调用 quit()在它的 Looper 上。

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

你应该做的是创建一个新线程并在 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
}
}

关于android - 在 Android 中使用 Looper.prepare() 的细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6673687/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com