在 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吗?
在 Android 中使用 Intent 在活动中传递 android 位图数据
无法在 Android 中使用 Android Crop 图像裁剪库