从另一个类中的线程更新 Android UI

2023-12-24

我在这里看到了一些提出类似问题的问题,但我还没有看到合适的答案。许多人询问如何从线程更新 UI,但它们几乎总是与 UI 位于同一类中。

我想做的是从另一个类中创建的线程更新 UI。我已经看到了所有的建议,例如异步、处理程序、可运行等......但我在单独的类中实现它们时遇到了真正的麻烦。

我试图使我的 UI 类保持最小,并且只处理与 GUI 的交互,例如当用户按下按钮时。现在,我在一个新类中创建了一个新线程,该线程连接到蓝牙设备,但随后我想将 UI 线程中的按钮从“连接”按钮更改为“断开连接”按钮(即更改从创建蓝牙套接字到关闭它的按钮)。

执行此操作的一般方法是什么?我是否认为这一切都是错误的,应该将所有内容都放在一堂课中? “主”UI 类和其他类/线程之间交互的正确方法是什么?

理想情况下,我希望能够进行其他 UI 交互,因此允许在 UI 类之外进行其他 UI 更改的解决方案会很棒!


我想做的是从一个线程更新 UI 在另一个类中创建。我已经看到了所有的建议,例如 异步、处理程序、可运行等等...但我遇到了真正的麻烦 在不同的类中实现它们。

一般来说,为了您的目标,我建议您使用:

  • AsyncTask http://developer.android.com/reference/android/os/AsyncTask.html
  • IntentService http://developer.android.com/reference/android/app/IntentService.html with ResultReceiver http://developer.android.com/reference/android/os/ResultReceiver.html

我不认为这太棘手。绝对不。如果您将其作为单独的类而不是某些中的内部类Activity类,所以我建议使用构造函数,您将在其中传递上下文、小部件,通常是您想要的任何内容,然后以正确的方法(允许 UI 更新)更新您的UI.

我这样做是因为我喜欢拥有干净的类(因此 UI 类只有 UI 实现并且逻辑单独定位)。

Example:

public class TaskExample extends AsyncTask<Void, Integer, Void> {

   private Context c;
   private Button b;

   public TaskExample(Context c, Button b) {
      this.c = c;
      this.b = b;
   }

   protected Void doInBackground(Void... params) {
      // some work
      if (isSomethingConnected) {
         publishProgress(Constants.IS_CONNECTED);
      }
      return null;
   }

   public void onProgressUpdate(Integer... params) {
       switch (params[0]) {
          case Constants.IS_CONNECTED:
             b.setText("Connected");
          break;
          case Constants.ANOTHER_CONSTANT:
             // another work
          break;
       }
   }  
}

Usage:

public class Main extends Activity implements View.OnClickListener {

   private Button b;

   public void onCreate(Bundle b) {
      super.onCreate(b);
      // initialise widgets and set listeners to appropriate widgets
   }

   public void onClick(View v) {
      switch(v.getId()) {
         case R.id.connectBtn:
            startWorker();
         break;
      }
   }

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

从另一个类中的线程更新 Android UI 的相关文章

  • Android:订阅 Firebase 云消息传递 (FCM) 主题

    根据Firebase 云消息传递文档 https firebase google com docs cloud messaging android send multiple 为了订阅用户的主题 我需要调用 FirebaseMessagin
  • 如何使自定义对话框透明?

    我需要使我的自定义对话框透明 我怎样才能做到这一点 您还可以在构造函数中使用以下行 getWindow setBackgroundDrawable new ColorDrawable 0
  • Core Audio 渲染线程和线程信号

    iOS 是否有任何类型的非常低级别的条件锁 不包括锁定 我正在寻找一种方法来从核心音频渲染线程内向等待线程发出信号 而不使用锁 我想知道是否可能存在像 Mach 系统调用这样的低级内容 现在我有一个核心音频线程 它使用非阻塞线程安全消息队列
  • Android Studio 2.2 更新:未使用新的 Gradle 插件 2.2.0 生成对齐的 APK (zipAlign)

    将 Android Studio 更新到版本 2 2 后 我还获得了 Gradle 插件的更新 它是 2 1 3 classpath com android tools build gradle 2 2 0 我看到未对齐的变体 APK 文件
  • 带有真实颜色的图标显示黑色背景

    使用新主题 Theme MaterialComponents 在按钮上放置图标时会显示一个黑框 如何放置具有真实颜色的图标
  • Android Json结果处理

    我有这样的 Json 结果 array getJSONObject j 执行代码 WAT2 FreeIssuePrefix DisPaySchedulePrefix NextFreeIssueNo 1 NextReturnNo 20 Upl
  • Facebook SDK 只适用于 Activity 吗?

    我一直在尝试将 Facebook SDK 实现到我的应用程序中 以便让用户通过该应用程序在我们的粉丝墙上发布消息 但是 我什至无法通过 SDK 登录用户 在 SDK 示例中 给出了一个简单的示例 该示例使用Activity尝试使用单点登录授
  • 在android中使用短信管理器发送批量短信

    我正在使用以下方式向近 90 100 个号码发送短信SmsManager 我正在从文件中读取数字并将数字传递给 sendtextmessage 函数 如下所示 String nos this array contains mobile no
  • 异步回调到BackgroundWorker

    我想使用 NET FTP 库 http netftp codeplex com http netftp codeplex com 该库提供 BeginOpenRead string AsyncCallback object 使用异步编程模型
  • Fragment 内的 FragmentPagerAdapter

    我在实现基于多个 ViewPager 的设计时遇到了一些麻烦 在较高的层次上 我有一个 FragmentActivity 其中只有一个 FrameLayout 作为其内容 我有 3 个不同的片段想要显示 所有 3 个均为全屏 一次仅使用 1
  • 未定义的参考错误 - rand

    我正在创建一个命令行 C 测试应用程序 可执行 以便在我的 root Android 设备上运行 该可执行文件使用多个预构建的 C 库 其中之一使用 rand 在链接状态期间我收到错误 rand 的未定义引用 为了检查路径是否设置正确 我尝
  • 如何在开头时解析 json 文件

    我想解析以下 JSON 文件 但以 向我表明这是一个数组 然后继续 对象 我当前的解析器返回一个 JSON 对象 我的问题是 如何修改解析器来解析这个文件 这样解析器将为我提供其他 JSON 文件 从对象或排列开始 JSON 文件 codi
  • Android 模拟器问题

    当我启动模拟器时 我遇到很多问题 错误 HttpConnectionApp emulator 5554 disconnected Cancelling net paxcel http HttpConnectionApp activity l
  • 如何在Android中使用资源

    一个人如何使用资产 我有这个代码 AssetManager assets getAssets InputStream stream assets open test txt 看起来它只能在 Activity 类中使 用 如果我尝试在另一个类
  • android形状xml旋转可绘制以编程方式改变颜色

    这是三角形的 xml
  • 蓝牙权限在 jetpack compose 中无法正常工作

    我在用com google accompanist accompanist permissions 0 25 1在我的项目中 我正在尝试在运行时请求蓝牙权限 我想知道用户如何知道权限被永久禁用 清单 xml
  • Android - 框架布局高度与协调器布局不匹配

    我的 FrameLayout 抽屉布局中的容器 有问题 FrameLayout的高度超过了屏幕高度 在底部的android默认菜单按钮下方
  • Android 以编程方式停止 toast 通知?

    有没有办法以编程方式停止 Toast 消息 假设我有一个按钮 单击它可以滚动 toast 消息 并且在 onclick 事件中我想停止队列中的所有消息并只显示新消息 我该怎么做 我的代码的简化版本如下 代码 public class Hel
  • Android Studio gradle 构建时间太长

    My 安卓工作室项目过去构建速度更快 但现在需要很长时间才能构建 有什么想法可能导致延误吗 我努力了https stackoverflow com a 27171878 391401 https stackoverflow com a 27
  • 如何获取 res.drawable 文件夹的路径来复制文件?

    我正在编写我的应用程序AndroidStudio 我的里面有gif文件drawable gifs文件夹 我希望将该文件复制到MediaStore Images Media单击按钮后的文件夹 目前 即使使用发布的一些答案 我也无法获取我的 g

随机推荐

  • 如何使用 Firestore 填充参考字段

    您知道如何使用 Firestore 填充文档上的参考字段吗 当您创建 获取文档参考时 您可以将其保存到另一个文档中 此示例适用于 Node SDK 但它应该能让您了解如何在 Android 上实现此示例 创建文档参考 Create the
  • 悬停在重叠的 CSS3 形状上

    好吧 我有一个关于与通过 CSS3 创建的形状进行交互的潜在棘手问题 请参阅以下小提琴 http jsfiddle net MH4LN 1 http jsfiddle net MH4LN 1 代码示例 div class container
  • 是否可以在不调用“node”的情况下运行 Node.js 脚本?

    我喜欢 javascript 所以当我听说时我很兴奋Node js http nodejs org 一个基于 V8 的 Javascript 运行时 我更愿意使用 Javascript 来编写 shell 脚本 我的问题是 如何在不调用的情
  • jquery 选择图像

    我希望允许用户选择预先上传的图像到用户生成的网页 我有一个可用图像的列表 因此我可以使用选择控件轻松地完成此操作 但是 我真的很想允许用户从缩略图弹出窗口中进行选择 而不是文本 然后填充文本带有结果文件名的表单元素 我希望最终结果会像日历弹
  • 在GDB中,如何打印具有特殊字符的符号的内容?

    我在用GDB调试的时候遇到一个小问题 问题是这样的 当我想获取 main 的地址时 我可以这样做 gdb peda p main 1
  • 端子输出安全逃生功能

    我正在寻找相当于网址编码 http docs python org library urllib html urllib quote plus对于终端输出 我需要确保我 可能 从外部源打印的垃圾字符最终不会在我的终端上做一些奇怪的事情 所以
  • DataView 和原型继承

    根据我在网上的了解 在 JavaScript 中扩展对象的一种方法是首先克隆它的原型 然后将该原型设置为子类的原型 但它似乎在这里不起作用 Create constructor function Packet opcode size Dat
  • Scala 中的 Typedef

    如何在 Scala 中定义类型 喜欢 type MySparseVector Int Double 在哈斯克尔或 typedef MySparseVector std list
  • 数据库设计头脑风暴:销售价格

    我需要创建一个数据库解决方案来提供产品折扣 当前表 Products Columns ProductId ProductTypeId ReleaseDate ProductPrices Columns ProductPriceId Prod
  • 对于 2.4MB XML 文件,您会推荐哪个 Ruby XML 库? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 2 4 MB 的 XML 文件 是从 Microsoft Project 导出的 嘿 我是这
  • Java 泛型:不兼容的类型

    我有一个通用类MyClass
  • MEF 与任何 IoC

    查看 Microsoft 的托管扩展性框架 MEF 和各种 IoC 容器 例如 Unity 我无法看出何时使用一种解决方案而不是另一种解决方案 更具体地说 MEF 似乎可以处理大多数 IoC 类型模式 并且不需要像 Unity 这样的 Io
  • .NET MAUI 应用程序的 Android 包签名

    我正在尝试将 NET MAUI 应用程序的捆绑文件上传到 Google Play 但收到以下错误 您的 Android App Bundle 使用错误的密钥进行签名 确保您的 App Bundle 已使用正确的签名密钥进行签名 然后重试 你
  • 从 MySQL 到 IndexedDB

    再会 我不确定我的问题是否可能 这就是我问的原因 我正在开发一个应用程序 它在线时使用 PHP MySQL 但离线时使用 indexedDB 好吧 这就是目标 对于用户来说 只是读取数据库 无需写入任何内容 在线时 我想填充 indexed
  • 使用重复模式填充 python pandas 数据框中缺失的行

    我正在尝试修复 pandas DataFrame 中丢失的行 如下所示 import pandas as pd df pd DataFrame 1 1 2 3 4 2 4 5 6 7 3 1 3 2 5 4 5 6 7 3 1 3 4 5
  • [Dead]如何利用异步回发成功 POST 到旧的 ASP.NET 站点

    更新 不幸的是我从来没有机会解决这个问题 然而 下面有一些有趣的回应 值得其他想要做类似事情的读者尝试 我正在尝试解析来自运行 ASP NET 的站点的数据 该站点有一个登录页面 我已成功遍历该页面 使用合法帐户 并为其存储了 cookie
  • 如何在 Postgres 数据库中存储 UTF-16 字符?

    我正在尝试存储一些文本 例如 在 Postgres 数据库中 但是当检索该值时 它在屏幕上显示为 我不知道为什么会这样做 我的印象是它是 UTF 8 中不支持的字符 但在 UTF 8 中是支持的 但是 从第一个答案来看 这是一个错误的假设
  • 在 python 3 中分析内存[重复]

    这个问题在这里已经有答案了 可能的重复 有没有适用于Python3的工作内存分析器 https stackoverflow com questions 7758699 is there any working memory profiler
  • OpenAI 健身房的突破-v0“暂停”

    在 OpenAI 健身房环境中训练时 我认为环境有时会 停止 对于连续的许多帧 没有球可见 停止生成 这是健身房环境的错误吗 这是 Breakout v0 游戏的一部分吗 我还想知道 Breakout v0 中可能采取的行动是什么 我想通了
  • 从另一个类中的线程更新 Android UI

    我在这里看到了一些提出类似问题的问题 但我还没有看到合适的答案 许多人询问如何从线程更新 UI 但它们几乎总是与 UI 位于同一类中 我想做的是从另一个类中创建的线程更新 UI 我已经看到了所有的建议 例如异步 处理程序 可运行等 但我在单