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

Posted

技术标签:

【中文标题】在 Android 中使用 Looper.prepare() 的细节【英文标题】:Specifics on using Looper.prepare() in Android 【发布时间】:2011-10-04 03:50:12 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

另外需要注意的是,默认情况下,当一个 Handler 被实例化时,它的代码总是在它创建的线程上执行

你应该做的是创建一个新线程并在 run() 中调用 Looper.prepare(),设置任何 Handlers,然后调用 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
    

【讨论】:

【参考方案2】:

您能举一些例子来说明您使用网络线程的目的吗?我认为你可以不使用 Looper 来解决你的问题。

您可以使用ASyncTask 执行后台任务,该任务可能会更新您的 UI 线程中的某些值。如果用户必须等到后台操作完成,您可以在 OnPreExecute 方法中显示ProgressDialog 并阻止应用程序,然后将其隐藏在 onPostExecute 中。

正如我所说,请详细描述您的需求和您想要实现的目标。

【讨论】:

以上是关于在 Android 中使用 Looper.prepare() 的细节的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android 应用程序中使用 OSM 地图。?有啥教程可以学习在android中使用OSM吗?

如何在Mac中使用Android SDK

在 Android 中使用 Intent 在活动中传递 android 位图数据

无法在 Android 中使用 Android Crop 图像裁剪库

Android:如何在 Android 中使用 tensorflow lite 扩展图像的维度

如何在android中使用WCF服务?