从另一个类中的线程更新 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 的相关文章

  • CardView 圆角获得意想不到的白色

    When using rounded corner in CardView shows a white border in rounded area which is mostly visible in dark environment F
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • Android Activity 生命周期函数基础知识

    我正在测试这段代码 它显示活动所处的状态 public class Activity101Activity extends Activity String tag Lifecycle Called when the activity is
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 未捕获 Func<> 的异常(异步)

    我有以下代码 为了进行此重现而进行了简化 显然 catch 异常块将包含更多逻辑 我有以下代码 void Main var result ExecuteAction async gt Will contain real async code
  • 发布android后更改应用内购买项目的价格

    在 Google Play 上发布后 是否可以更改应用内购买商品的价格 我假设该应用程序也已发布 完整的在线文档位于http developer android com http developer android com也http sup
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 如何使用 IF 检查 TextView 可见性

    我有一个 onCheckedChangeListener 来根据选择的单选按钮显示文本视图 我有 1 个疑问和 1 个难题 想知道是否有人可以帮助我 问题 您能否将单选组默认检查值设置为 否 单选按钮 以便一开始就不会检查任何内容 问题 如
  • 在 SQLite 中搜索时排除 HTML 标签和一些 UNICODE 字符

    更新 4 我已经成功运行了firstchar例如 但现在的问题是使用regex 即使包含头文件 它也无法识别regex操作员 有什么线索可以解决这个问题吗 更新 2 我已经编译了sqlite3我的项目中的库 我现在正在寻找任何人帮助我为我的
  • Google 云端硬盘身份验证异常 - 需要许可吗? (v2)

    我一直在尝试将 Google Drive v2 添加到我的 Android 应用程序中 但无法获得授权 我收到 UserRecoverableAuthIOException 并显示消息 NeedPermission 我感觉 Google A
  • 无锁算法真的比全锁算法性能更好吗?

    陈雷蒙德 http blogs msdn com b oldnewthing 一直在做一个huge http blogs msdn com b oldnewthing archive 2011 04 15 10154245 aspx ser
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • Android:膨胀布局时出现 StackOverFlowError 和 InvokingTargetException

    首先 对不起我的英语 我在膨胀布局时有一个问题 我有一个自定义视图 从 LinearLayout 扩展而来 称为按钮帮助 我在名为的布局上使用该视图加载活动 我的以下代码在所有设备和模拟器上都能完美运行 但具有 QVGA 屏幕 例如 Sam
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 将两个文本视图并排放置在布局中

    我有两个文本视图 需要在布局中并排放置 并且必须遵守两条规则 Textview2 始终需要完整显示 如果布局中没有足够的空间 则必须裁剪 Textview1 例子 文本视图1 文本视图2 Teeeeeeeeeeeeeeeeeextview1
  • android sdk 的位置尚未在 Windows 操作系统的首选项中设置

    在 Eclipse 上 我转到 windows gt Android SDK 和 AVD Manager 然后弹出此消息 Android sdk 的位置尚未在首选项中设置 进入首选项 在侧边栏找到 Android 然后会出现一个 SDK 位
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • 如何使用 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 我已经看到了所有的建议 例如异步 处理程序 可运行等 但我在单