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

runOnUiThread在以下代码中如何工作而不影响现有UI线程[重复]

申思远
2023-03-14

在下面的代码中,我们使用runOnUiThread的方式不应该对现有的UI线程产生问题,从而对应用程序产生问题,因此不应该使用

Thread thread = new Thread(new Runnable(){
    @Override
    public void run(){
        //what is meant by the inside code of this run(), how is this updating the UI 
        runOnUiThread(new Runnable(){
            @Override
            public void run(){

            }
        })
    }
})

共有3个答案

徐俊人
2023-03-14

每当我们有一些长时间运行的任务时,我们就会切换到一些工作线程,避免主线程,并允许更平滑的用户体验,避免ANR。

但是,当更新UI的时间到来时,我们必须“返回”到主线程,因为只有主线程才允许触摸和更新应用程序UI。

我们可以通过调用活动的runOnUiThread()方法来实现这一点:

基本上,runOnUiThread()将在UI线程上运行指定的操作。它将检查当前线程,如果找到它的主线程,它将立即执行该任务,否则首先它将切换到应用程序主线程,然后它将执行给定的任务。

徐弘图
2023-03-14

Android中有两种类型的线程。

1是UI或主线程,您的UI元素(布局)在其上呈现。

2是应该在其中执行长任务(如AsyncTask)的工作线程

如果您在new Thread中编写一些任务,这意味着该任务将在工作线程中执行。

现在,您将使用runOnUiThread新处理程序(Looper.getMainLooper()),因为您不能在工作线程中触摸UI元素。

因此,基本上当您更新setText()Toast或任何UI操作等UI时,您将不得不使用UI线程,并且在执行一些长时间执行时应该使用工作线程。

编辑

一般来说,我们不需要在Android中管理线程。因为我们使用的所有图书馆都是智能的。尽管在某些情况下,我们还必须管理线程。

实例

假设您在新的Thread调用Web服务(api),现在当响应到来时,您需要显示Toast。如果您直接在WorkerThread中编写Toast.show....作为响应,您将获得异常。

只有创建视图层次的原始线程才能接触其视图。

现在要解决这个问题,您必须使用runOnUiThread,这样您就可以显示Toast了。

能远
2023-03-14

在android中,对于长时间运行的任务,您应该使用单独的线程,例如AsyncTask()或service。假设您想更新您的UI,就像您想向用户显示任何Toast一样,那么您应该编写runOnUiThread(),因为只有UI线程才允许触摸UI组件。

    getActivity().runOnUiThread(new Runnable() 
    {

     @Override
     public void run() {              
     Toast.makeText(getContext(), "API calling done!!", Toast.LENGTH_LONG).show();

    }
  });
 类似资料:
  • 根据了解node.js事件循环,node.js支持单线程模型。这意味着如果我向node.js服务器发出多个请求,它不会为每个请求生成一个新线程,而是一个接一个地执行每个请求。这意味着如果我在node.js代码中对第一个请求执行以下操作,同时节点上出现一个新请求,第二个请求必须等到第一个请求完成,包括5秒的睡眠时间。对吗? 有没有一种方法可以让node.js为每个请求生成一个新线程,这样第二个请求就

  • 虽然这个问题似乎已经被问了很多次,而且我已经得到了很高的答案,但我想指出,多个答案是相互冲突的,而且我永远无法完全理解异步代码的内部结构。我完全理解它的意思是继续顺序代码执行并在以后完成任务,我正在努力理解后面的部分。 答案1-建议UI/Main 首先,这个问题包含了下面的测试,建议异步代码运行在main/UI线程上,并链接了一篇文章,解释为什么异步代码没有其他线程。 问:“在我看来,由于我主要做

  • 问题内容: 基本上,此代码在两个类中创建了两个线程,它们从第三类中调用。每个线程都有一个循环,每次循环后都会进入休眠状态。 (代码末尾) 输出为: 1)我不知道为什么它会这样工作。我的意思是应该先打印“ CHECK 0 CHECK”。但是,为什么在线程1之前打印CHECK 1 CHECK(而在代码中调用Thread1之后才打印),而对于CHECK 2 CHECK和Thread2却一样? 2)如果我

  • 我运行Http服务器使用Netty I/O库在四核Linux机器上。使用默认工作线程池大小(在Netty中内部设置为2 x内核数)运行时,性能分析显示吞吐量上限为1k请求/秒,请求速率的进一步增加导致延迟几乎线性增加。 由于最大CPU利用率显示为60%,我根据下面的代码增加了工作线程的数量。然而,性能几乎没有任何变化,CPU仍然限制在60-70%。该进程不受内存、I/O或网络带宽的限制。为什么不通

  • 例如,我有一个接口,有不同的实现,比如、,我可以只编写一个测试类来测试这两个吗? 有一篇文章展示了一个例子,但是如果有多个测试方法需要调用,我必须为每个测试方法传递参数。 我可以问一下,是否有一种像Junit4中使用的优雅的方法 提前感谢您的帮助

  • 实际上,下面的代码不能用这个命令用Clang编译: . 我只想模仿与C中的“交换习惯用法”相同的行为,使用“using directive”来启用ADL。但是下面的代码哪里错了呢?预期的调用优先级应为:N1::foo 错误消息: 更新: 我将N2::foo更改为可以在某种程度上模仿std::交换的模板方法。所以,这里的问题是为什么不能由在函数中?因为当它们具有相同的优先级时,该函数应该比要调用的模