【问题标题】:How to post callbacks in Android to any arbitrary thread如何在 Android 中将回调发布到任意线程
【发布时间】:2015-01-21 04:21:40
【问题描述】:

我使用的 Unity 游戏引擎也支持导出到 Android。

引擎使用多个线程,包括 UI 线程和执行所有用户自定义代码的单独脚本线程。

我的场景要求我在后台线程中调用一些操作,并且我想将结果编组回主脚本线程。

我知道AsyncTaskExecutorLooper 类的基础知识。其中,Looper 似乎是一个不错的选择,因为它允许设置队列并将消息回发到给定线程(AsyncTask 是“硬连线”以在 UI 线程上运行回调,这不是我想要的)。

实现这一目标的正确方法是什么?

【问题讨论】:

  • Handler 将帮助您在后台线程中调用操作。
  • 自定义 BroadcastReceiver 怎么样?
  • @DonChakkappan 我相信 Handler 会做到的,正如上面评论中所建议的那样。我没有使用过,但我会检查该类的文档。

标签: java android multithreading android-asynctask looper


【解决方案1】:

与 UI 线程通信的主要方式有 3 种:

  1. Activity.runOnUiThread(Runnable)

  2. View.post(Runnable)

  3. Handlers

就您而言,我建议您创建一个Handler,因为前两种解决方案意味着您在ActivityView 上有一个参考

编辑

如果您想在应用程序中使用任何线程,只需确保已设置 Looper,并使用关联的 Handler

class YourLooperThread extends Thread
{
    // make it accessible from the outside
    private Handler handler;

    @Override public void run()
    {
        Looper.prepare();

        // Customize your handler, it has to be used in any thread which want to push a message in this thread's looper message Queue
        handler = new Handler();

        Looper.loop();
    }
}

小心:您想在该线程中执行的所有其他任务都必须通过消息队列完成,即在处理程序中发布一个可运行的。更多信息在这里:Handlers, MessageQueue, Looper, do they all run on the UI thread?

【讨论】:

  • 谢谢。我的问题特别提到,虽然我不想在 UI 线程上执行,但在进程中的任意线程上执行。
  • 谢谢。是否必须将其放置在自定义 Thread 类中?我的情况是框架已经创建了一个线程。我可以添加一个处理程序和一个循环器并将处理程序公开给其他线程以发布到吗?另外,所有任务都应该通过消息队列完成是什么意思?
  • 这个问题会帮助你理解:stackoverflow.com/questions/6984263/… Looper,当它在循环时,会阻塞你的线程,所以这个不能执行任何其他操作。如果这个线程来自一个框架,它可能是一个问题。
猜你喜欢
  • 2012-11-14
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多