从另一个线程在主线程中运行代码
2022-08-31 04:43:33
在Android服务中,我创建了用于执行一些后台任务的线程。
我有一个线程需要在主线程的消息队列上发布某些任务的情况,例如.Runnable
有没有办法从我的其他线程获取主线程并发布/到它?Handler
Message
Runnable
在Android服务中,我创建了用于执行一些后台任务的线程。
我有一个线程需要在主线程的消息队列上发布某些任务的情况,例如.Runnable
有没有办法从我的其他线程获取主线程并发布/到它?Handler
Message
Runnable
注意:这个答案引起了很多关注,我需要更新它。自从原始答案发布以来,来自@dzeikei的评论几乎与原始答案一样受到关注。所以这里有2种可能的解决方案:
1. 如果后台线程具有对上下文
对象的引用:
确保后台工作线程有权访问上下文对象(可以是应用程序上下文或服务上下文)。然后只需在后台工作线程中执行此操作:
// 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. 如果后台线程没有(或不需要)上下文
对象
(@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);
正如下面的评论者正确指出的那样,这不是服务的通用解决方案,仅适用于从您的活动启动的线程(服务可以是这样的线程,但并非所有这些线程都是)。关于服务活动沟通的复杂主题,请阅读官方文档的整个服务部分 - 它很复杂,因此了解基础知识是值得的:http://developer.android.com/guide/components/services.html#Notifications
以下方法可能适用于最简单的情况:
如果我正确地理解了你,你需要在应用程序的GUI线程中执行一些代码(不能考虑任何其他称为“主”线程的东西)。为此,有一个方法:Activity
someActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
//Your code to run in GUI thread here
}//public void run() {
});
希望这就是你正在寻找的。