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

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

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

推荐答案

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

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相关问答推荐

在现代操作系统/硬件上按块访问数据值得吗?

Java 21虚拟线程执行器的性能比池化操作系统线程的执行器差?

如何在运行时动态创建表(使用Java、JPA、SprringBoot)

Mapstruct不能正确/完全映射属性

Spring Data JPA慢慢地创建了太多非活动会话

如何从JNI方法正确调用NSOpenPanel以在正确的线程上运行?

WebSockets和Spring Boot安全性出现错误401

如何在Cosmos DB(Java SDK)中增加默认响应大小

在VS代码中,如何启用Java Main函数的&Q;Run|DEBUG&Q;代码?

Java泛型类方法的静态返回类型是否被类型擦除?

接受类及其接口的Java类型(矛盾)

TinyDB问题,无法解析符号';上下文&

如何在Selenium上继续使用最新的WebDriver版本

将@Transactional添加到Spring框架中链下的每个方法会产生什么效果?

这是JavaFX SceneBuilder的错误吗?

使用DynamoDB增强客户端时未更新属性

ArrayAdapter 中何时使用构造函数一和构造函数二?

如何对 Collectors.Counting() 的结果进行算术运算?

Sonarlint 警告我可能出现 NullPointerException,但在我看来,我做了必要的事情来防止它发生?

如何在 Spring Boot 中对来自请求的字符串列表进行验证?