从另一个线程在主线程中运行代码

在Android服务中,我创建了用于执行一些后台任务的线程。

我有一个线程需要在主线程的消息队列上发布某些任务的情况,例如.Runnable

有没有办法从我的其他线程获取主线程并发布/到它?HandlerMessageRunnable


答案 1

注意:这个答案引起了很多关注,我需要更新它。自从原始答案发布以来,来自@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);

答案 2

正如下面的评论者正确指出的那样,这不是服务的通用解决方案,仅适用于从您的活动启动的线程(服务可以是这样的线程,但并非所有这些线程都是)。关于服务活动沟通的复杂主题,请阅读官方文档的整个服务部分 - 它很复杂,因此了解基础知识是值得的: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() {
});

文档: http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29

希望这就是你正在寻找的。


推荐