为什么要使用 Handlers 而 runOnUiThread 会做同样的事情?

2024-03-30

我都遇到过Handlers http://developer.android.com/reference/android/os/Handler.html and 在UiThread上运行 http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29概念。但对我来说,它们到底在哪些事实上存在差异似乎仍然是一个疑问。

它们都旨在从后台线程执行 UI 操作。但我们在选择这两种方法时要考虑哪些因素呢?

例如考虑一个Runnable Thread它在后台执行 Web 服务,现在我想更新 UI。

更新用户界面的最佳方式是什么?我应该去吗Handler or runOnUiThread?

我仍然知道我可以使用AsyncTask并利用onPostExecute。但我只是想知道其中的区别。


Activity.runOnUiThread() http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29是更通用的特殊情况Handlers http://developer.android.com/reference/android/os/Handler.html. With Handler您可以在自己的线程中创建自己的事件查询。使用Handlers实例化为默认构造函数 http://developer.android.com/reference/android/os/Handler.html#Handler%28%29 doesn't mean "代码将在 UI 线程上运行” 一般来说。默认情况下,处理程序绑定到Thread它们是从中实例化的。

创建一个Handler保证绑定到 UI(主)线程,您应该创建一个Handler对象绑定到主循环器像这样:

Handler mHandler = new Handler(Looper.getMainLooper());

此外,如果您检查runOnUiThread()方法,它正在使用Handler做这些事情:

  public final void runOnUiThread(Runnable action) {
        if (Thread.currentThread() != mUiThread) {
            mHandler.post(action);
        } else {
            action.run();
        }
    }

从上面的代码片段可以看出,Runnable action如果出现以下情况,将立即执行runOnUiThread()从 UI 线程调用。否则,它将发布到Handler,它将在稍后的某个时刻执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么要使用 Handlers 而 runOnUiThread 会做同样的事情? 的相关文章

  • 从 Throwable 获取错误代码 - Android

    我怎样才能从错误代码可投掷 https developer android com reference java lang Throwable html public void onFailure Throwable exception 我
  • 在自定义对象中创建时粘性服务不会重新启动

    我有一个具有绑定服务的单例对象 我希望它重新启动 当我从启动器启动应用程序时 单例对象将初始化并绑定到这个现有的服务实例 以下是在单例中创建和绑定服务的代码 public class MyState private static MySta
  • 共同的偏好不断消失

    我正在使用共享首选项来存储我的应用程序的登录凭据 除了一个用户之外 一切正常 一段时间后 共享偏好似乎会以某种方式重置或清除 我已针对该用户调整了我的应用程序 使其不再清除他的共享偏好设置 这样我就可以确定这不是我的应用程序的错 但即使在这
  • 接近语法错误(代码1)插入Android SQLite

    我正在创建一个通讯录应用程序 用户可以在其中输入姓名 电子邮件地址和号码 我希望将此数据保存在数据库中 但我似乎无法使插入方法起作用 我收到的错误是 android database sqlite SQLiteException near
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • 已经使用 AsyncTask doInBackground 但新数据未显示

    我使用 AsyncTask 创建一个聊天室来接收消息 因此它总是检查即将到来的消息并将其显示给客户端 但代码似乎无法按我希望的方式工作 在客户端只显示所有旧数据 新数据不显示 因为当我尝试从服务器发送消息时 新数据没有显示在客户端中 我对这
  • 获取 AlarmManager 中活动的 PendingIntents 列表

    我有办法获取活动列表PendingIntent在设备中 我开始工作AlarmManager我想看看我的PendingIntents 已正确创建和删除 也很高兴看到其他什么PendingIntent在那里 只是为了看看某些应用程序是否正在做一
  • 在 C# 中创建加密随机数的最快、线程安全的方法?

    请注意 在多个线程上并行生成随机数时 加密随机数生成器不是线程安全的 使用的发电机是RNGCryptoServiceProvider它似乎重复了很长一段随机位 128 位 重现此情况的代码如下所示 缺乏使用锁来保护访问RNGCryptoSe
  • minHeight 有什么作用吗?

    在附图中 我希望按钮列与图像的高度相匹配 但我也希望按钮列有一个最小高度 它正确匹配图像的高度 但不遵守 minHeight 并且会使按钮向下滑动 我正在为按钮列设置这些属性
  • Flutter 深度链接

    据Flutter官方介绍深层链接页面 https flutter dev docs development ui navigation deep linking 我们不需要任何插件或本机 Android iOS 代码来处理深层链接 但它并没
  • Android 启动器快捷方式

    我制作了一个简单的打卡 打卡时钟应用程序 我想向用户添加在主屏幕上创建快捷方式的选项 该快捷方式将切换应用程序的状态 超时 超时 但我根本不希望此快捷方式在屏幕上打开应用程序 这是我的 setupShortcut private void
  • ROOM迁移过程中如何处理索引信息

    CODE Entity tableName UserRepo indices Index value id unique true public class GitHubRepo PrimaryKey autoGenerate true p
  • MediaCodec 创建输入表面

    我想使用 MediaCodec 将 Surface 编码为 H 264 使用 API 18 有一种方法可以通过调用 createInputSurface 然后在该表面上绘图来对表面中的内容进行编码 我在 createInputSurface
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 如何在不更改手机语言的情况下更改Android应用程序语言?

    我希望用户在应用程序内选择一种语言 选择语言后 我希望字符串使用特定语言 如果我更改手机语言 那么我的应用程序将以设置的语言运行 我无法找到任何在不更改手机语言的情况下设置语言的方法 此外 一旦设置了语言 更改就应该反映出来 有人可以建议一
  • Android 设备上的静默安装

    我已经接受了一段时间了 在 Android 上静默安装应用程序是不可能的 也就是说 让程序安装捆绑为 APK 的应用程序 而不提供标准操作系统安装提示并完成应用程序安装程序活动 但现在我已经拿到了 Appbrain 快速网络安装程序的副本
  • 如何将图像从 Android 应用程序上传到网络服务器的特定文件夹中

    如何将图像从 android 移动到 Web 服务器上的指定文件夹 这是我的安卓代码 package com example bitmaptest import java io ByteArrayOutputStream import ja
  • 为什么Android的ImageReader类这么慢?

    我尝试了适用于 Android 3 4 1 的全新 OpenCVJavaCamera2View但它太慢了 仅显示相机视图约 15 fps 当我尝试较旧的JavaCameraView相反 它给了我很好的结果 30fps 这是我相机的极限 我想
  • 无法运行我的应用程序,要求选择 Android SDK

    今天我已经安装了Android Studio 金丝雀 1 现在我无法运行我的应用程序 将出现以下对话框 我已经通过 文件 gt 项目结构 gt Android SDK 位置 设置了正确的 SDK 位置 期待您的帮助来解决这个问题 警告对话框
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项

随机推荐

  • 使用 R 并行批量调整图像大小

    我正在尝试使用 R 批量调整数千个图像的大小 即减小文件大小 我已经使用下面的代码成功地实现了这一点 但这需要很长时间 特别是当调整大小 gt 50 000 个图像时 有什么办法可以让这个任务在多个核心上运行吗 我是并行计算方面的新手 因此
  • 如何在 Google Charts 中获取带有 svg 内图像的 png(base64)?

    如何获取 svg 内图像的 base64 检查这个Fiddle http jsfiddle net R8A8P 51 这是我从另一个问题中得到的 如果您看到第二个图形 则它不会生成覆盖该条的图像 var chart new google v
  • Gstreamer multifilesink wav 文件分割

    我在使用 gstreamer 录制流时遇到问题 我必须分别编写音频和视频 并在信号到达时切入 我的视频工作正常 但 wav 文件仍然存在问题 即使 gst launch 中的简单管道也无法正常工作 我有波形文件 我正在尝试使用 multif
  • 为什么 Rails 要为 JSON PUT 请求返回“head :no_content”?

    我跑完之后 rails generate scaffold UserRails 3 2 11 中生成的用于更新用户的控制器函数如下所示 def update user User find params id respond to do fo
  • 家长/孩子同桌

    我有如下表结构 id parent name value 1 0 aaa 2 0 bbb 3 0 ccc 4 1 111 5 1 222 6 3 333 如果父记录有子记录 我想显示父记录 Like 父代 ID 名称 第一个子代的值 1 a
  • 如何在 CodeIgniter 中使用准备好的语句

    大家好 我需要在我的网站中使用准备好的语句 我尝试使用这个 sql SELECT FROM tbl user WHERE uid id and activation key key query this gt db gt query sql
  • 实体框架查找与何处

    之间是否存在显着差异 Find id and Where x gt x Id id 这应该迫使我使用 Find over Where First 我会想象 Find 会更有效 但是我应该避免这样做吗 Where First 我问的原因是我在
  • 项目GUID不断变化

    我们有一个 VS2008 解决方案 我注意到发生了一些奇怪的事情 某些项目引用同一解决方案中定义的其他项目 作为项目引用添加 这是前一段时间完成的 直接从 VS 构建效果很好 从 MSBUILD 构建失败 我已删除项目引用并重新添加它 并且
  • npm install 与 sudo npm install -g

    对于某些包我必须运行sudo npm install g而对于其他人npm install就足够了 为什么以及有什么区别 例如 npm install g grunt cli doesn t work sudo npm install g
  • 无法使用 JavaScript 选择最接近的 h2 元素

    我希望能够选择与包含披萨选择选项的字段集最接近的 h2 标题 并使用 jQuery 设置标题的文本 到目前为止我还无法做到这一点 HTML div fieldset fieldset div
  • Breeze 和 Knockout 中的验证

    我最近使用 Knockout 和 ASP NET MVC4 将 Breeze 添加到项目中 我真的很喜欢 Breeze 它节省了大量的编码工作 我使用过 Knockout 验证 喜欢它如何验证数据输入时的属性字段文本框以及错误消息的显示方式
  • Laravel - 捕获 cURL 异常的正确方法

    我正在使用 cURL 构建一个简单的 REST API 包 并希望捕获错误然后返回视图 如果我 dd e 我可以抛出错误 但如果我尝试返回一个视图 它只会继续执行 catch 函数之后的代码 PHP 不应该终止进程并直接进入登录视图吗 tr
  • 在 Rubymine 中运行 Rails 时找不到图像

    当我尝试在 Rubymine 中运行一些 Rails 命令时 出现以下错误 我最近更改了一些权限以使一些符号链接正常工作 尽管这可能不相关 例如当我跑步时rails c我收到此类错误 RAILS GROUPS is unset defaul
  • ruby on Rails + xampp + mysql (Windows 7)

    我正在尝试在 Windows 7 上将 xampp 中包含的 mysql 包与 ruby on Rails 一起使用 但似乎无法让它们一起工作 我有 Rails 3 0 0 和 xampp 1 7 3 Rails 在 xampp 中与 sq
  • 使用Python Mock库来监视内部方法调用

    我正在使用 Python 模拟模块进行测试 我想监视活动对象发出的内部方法调用 我发现 wraps kwarg 可用于设置一个模拟来监视对活动对象的方法调用 使用 Python 模拟来监视对现有对象的调用 https stackoverfl
  • 有谁在 PyCharm 中拥有以下库的“文档 URL”:

    我是 PyCharm 和其他 Jetbrains IDE 的 快速文档 功能的粉丝 但它需要知道每个库的特定 文档 URL 该功能在Preferences gt Tools gt Python External Documentation设
  • 识别 WCF 服务中的客户端

    我有一个工作双工 WCF 服务WSDualHttpBinding 我的问题是找到一种方法来存储具有唯一 ID 的回调通道 该服务旨在长期运行 我可以简单地抓住OperationContext Current GetCallbackChann
  • 如何将参数传递给 HttpInterceptor?

    我正在使用 Angular 4 3 1 和 HttpClient 有一个 HttpInterceptor 来设置一些标头 在某些 http get 请求中 我需要设置不同的标头 无论如何 我可以将一些参数传递给该特定 HttpRequest
  • 如何滚动到页面中间(50%)

    如果不使用流行的scrollTo插件 我如何滚动到页面 div的垂直中间 50 这会将 div 的地狱卷轴滚动到其垂直中间 var myDiv yourdiv var scrollto myDiv offset top myDiv heig
  • 为什么要使用 Handlers 而 runOnUiThread 会做同样的事情?

    我都遇到过Handlers http developer android com reference android os Handler html and 在UiThread上运行 http developer android com r