当前位置: 首页 > 知识库问答 >
问题:

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

叶鸿
2023-03-14

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

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

有没有方法获取主线程的处理程序并从我的另一个线程向它发布消息/runnable

共有2个答案

党星鹏
2023-03-14

正如下面的一位评论者正确指出的,这不是一个服务的通用解决方案,只针对从您的activity启动的线程(一个服务可以是这样的线程,但不是所有那些都是)。关于服务这一复杂的话题----activity通信,请阅读正式文件的整个服务部分----它很复杂,因此了解基本知识是值得的: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() {
});

doc:http://developer.android.com/reference/android/app/activity.html#runonuithread%28java.lang.runnable%29

希望这是你要找的。

闾丘英悟
2023-03-14

注意:这个答案已经得到了如此多的关注,我需要更新它。自从原答案发布后,来自@dzeikei的评论获得了几乎和原答案一样多的关注。所以这里有2种可能的解决方案:

1.如果后台线程引用了context对象:

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

// 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.如果后台线程没有(或需要)context对象

(@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问题,而不是Android的第一个问题! 我想从二级线程的上下文中了解如何在主线程上运行代码。例如: 这类事情-我意识到我的示例有点差,因为在Java中,您不需要进入主线程即可打印出某些内容,并且Swing也具有事件队列- 但在一般情况下,您可能需要在后台线程的上下文中,在主线程上运行Runnable。 编辑:为了进行比较-这是我在Objective-C中的做法:

  • 我如何启动两个线程,其中thread1首先执行,thread2在thread1结束时启动,而主方法线程可以在不锁定其他两个线程的情况下继续工作? 我尝试了join(),但是它需要从线程调用,线程必须等待另一个线程,没有办法执行类似thread2.join(thread1)的操作;因此,如果我在main()中调用join,我将有效地停止主线程的执行,而不仅仅是Thread2的执行。 #编辑:为什么我

  • 问题内容: 我的一项活动遇到了一个奇怪的问题。从拍照/录像回来时,我正在显示一个对话框,允许用户命名相机。用户按下“确定”后,我将使用所请求的文件名发送给主题,该主题将复制文件(并显示进度对话框)。 由于某种原因,即使我调用,总是在主线程上调用执行复制的函数。 更改呼叫以解决问题。我还是想知道为什么它不起作用… 问题答案: 并且是那里最混乱的运营商。前者确保订阅副作用在指定的调度程序(线程)上发生

  • 例如: 假设有一个按钮启动异步请求,该请求返回并触发主线程上运行的runnable/callback。会发生什么?runnable被添加到MessageQueue中,并在“时间”到时运行。但是什么时候是“时间”呢?如果在异步请求将runnable发布到MainThread之前,我按下另一个按钮,在MainThread上执行一些半长的阻塞任务呢?它会等到我的阻塞按钮上的逻辑完成吗?会打断它吗?它是否

  • 我试图用一个自定义对象创建一个新线程,然后从主线程调用这个自定义对象方法。其思想是,主线程可以继续执行其他任务,而自定义对象可以继续在第二个线程中工作: 输出为: 它应该更像这样: 所以主线程被阻塞,直到方法完成。主线程是否在第二个线程中等待完成(作为返回类型为空,我认为情况不会如此)?还是在第一个线程中执行,因此阻塞了它? 我知道使用下面的代码,我可以在另一个线程中执行,但它每次都会从头开始创建