在一个android服务中,我创建了一些线程来执行一些后台任务.

我遇到一种情况,线程需要在主线程的消息队列上发布特定任务,例如Runnable.

有没有办法从我的另一个线程获取Handler个主线程并发布Message/Runnable到它?

推荐答案

注意:这个答案已经引起了很多关注,我需要更新它.自从原始答案发布后,@dzeikei的评论几乎和原始答案一样受到关注.以下是两种可能的解决方案:

1. If your background thread has a reference to a 100 object:

确保您的后台工作线程可以访问上下文对象(可以是应用程序上下文或服务上下文).然后,只需在后台工作线程中执行以下操作:

// Get a handler that can be used to post to the main thread
Handler mainHandler = new Handler(context.getMainLooper());

Runnable myRunnable = new Runnable() {
    @Override 
    public void run() {....} // This is your code
};
mainHandler.post(myRunnable);

2. If your background thread does not have (or need) a 100 object

(由@dzeikei建议):

// Get a handler that can be used to post to the main thread
Handler mainHandler = new Handler(Looper.getMainLooper());

Runnable myRunnable = new Runnable() {
    @Override 
    public void run() {....} // This is your code
};
mainHandler.post(myRunnable);

Java相关问答推荐

Swing 从弹出表中获取用户输入

将 android studio 升级到 Android Studio Chipmunk 后 | 2021.2.1 得到这个 gradle 问题

如何总结具有特定 ID 的列表中对象的属性值并使用 Streams 将其分配给另一个对象

@PutMapping MockHttpServletResponse 的 JUnit RestControllerTest 正文为空

如何在没有长度和 indexOF 的情况下获取字符串中的信息. (JAVA)

设计查询 - 使用 Java 泛型进行代码复制

使用 lib net.lingala.zip4j 时,Javafx Gradle 使异常 org.gradle.process.internal.ExecException 以非零退出值 1 结束

有效地改变 JSON 数据的结构

Mockito,如何在方法中创建的对象上调用验证?

没有@Target 的注解类型可以在任何地方使用吗?

在 Selenide 中基于父元素创建子元素集合

为什么在运行 GUI 时不显示 JLabels 或 JButton?

打印所有可以使用 `+` 或 `-` 运算符给出给定数字的组合

在处理可能为空的流时寻找解决 Stream.allMatch 等于 true 的优雅方法

根据列表 LocalDateTime 对象和已采取的带流的时隙列表创建可用时隙列表

Java中的重复输出

如何使用 Java Stream API 处理 NumberFormatException

迷宫 2D 递归算法问题

查找有向图中的所有循环,包括后边

JMS setRollbackOnly - 不一致的行为