Android 后台线程

embedded/2025/1/19 14:07:15/
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() {@Overridepublic void run() {Bitmap bitmap = getBitmapFromUrl(url); // 网络请求runOnUiThread(new Runnable() {@Overridepublic void run() {imageView.setImageBitmap(bitmap); // 在主线程更新UI}});}
});

解释

ExecutorService executor = Executors.newSingleThreadExecutor();

作用:创建一个单线程的线程池 executor。这个线程池用于执行后台任务(例如网络请求),并确保这些任务在非主线程中运行,避免阻塞 UI。

  1. 提交异步任务
executor.execute(new Runnable() {@Overridepublic void run() {Bitmap bitmap = getBitmapFromUrl(url); // 网络请求

作用:
使用 executor.execute() 方法将任务提交到线程池。
Runnable 中的代码会在线程池的线程中执行,而 不在主线程 中执行。
任务内容是通过 getBitmapFromUrl(url) 方法从网络获取图片(一个耗时操作)。

  1. 切换到主线程
runOnUiThread(new Runnable() {@Overridepublic void run() {imageView.setImageBitmap(bitmap); // 在主线程更新UI}
});

runOnUiThread 的作用:
runOnUiThread 是 Android 提供的一种工具,用于切换到主线程执行代码。
由于 UI 更新只能在主线程中完成,imageView.setImageBitmap(bitmap) 必须在主线程中调用。
这里将 bitmap 设置到 imageView 上显示。

  1. 任务完成后关闭线程池(可选)
    一般情况下,线程池是可以重用的。如果你只需要执行一次任务,可以在任务完成后调用:
executor.shutdown();

以关闭线程池,释放资源。

为什么需要线程池?
网络请求(如 getBitmapFromUrl)是耗时操作,直接在主线程中执行会阻塞 UI 并可能导致 ANR(应用无响应)。线程池允许在后台线程中执行这些耗时任务。

为什么需要切换到主线程?
Android 规定,所有 UI 操作(如 imageView.setImageBitmap)都必须在主线程中完成,否则会导致异常。

完整流程:

创建线程池。
在后台线程中执行网络请求获取图片。
通过 runOnUiThread 切换到主线程更新 UI。
(可选)任务完成后关闭线程池。


http://www.ppmy.cn/embedded/155237.html

相关文章

【LeetCode】力扣刷题热题100道(31-35题)附源码 搜索二维矩阵 岛屿数量 腐烂的橙子 课程表 实现 Trie (前缀树)(C++)

一、搜索二维矩阵 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 可以使用 从右上角开始搜索 的方法来有效地找到目标值。 选择起始位置: 从矩…

C++实现设计模式---装饰器模式 (Decorator)

装饰器模式 (Decorator) 装饰器模式 是一种结构型设计模式,它允许动态地将责任附加到对象上,既可以在运行时给一个对象添加功能,又不会影响其他对象的功能。 意图 动态地扩展对象的功能。避免创建过多的子类,通过装饰器来“包装…

unity——Prejct3——背景音乐

1.音乐数据结构类 using System.Collections; using System.Collections.Generic; using UnityEngine;//音乐数据结构类 public class MusicData {//背景音乐 音效 开关public bool musicOpen true;public bool soundOpen true;//背景音乐 音效 大小public float musicValu…

LabVIEW与WPS文件格式的兼容性

LabVIEW 本身并不原生支持将文件直接保存为 WPS 格式(如 WPS 文档或表格)。然而,可以通过几种间接的方式实现这一目标,确保您能将 LabVIEW 中的数据或报告转换为 WPS 可兼容的格式。以下是几种常见的解决方案: ​ 导出…

解决Element Plus el-date-picker组件清空时,触发两次change的问题

问题 el-date-picker 组件在选择日期范围时会触发两次 change 事件。当用户选择了范围的开始时&#xff0c;会立即触发一次 change 事件。而当用户选择了范围的结束时&#xff0c;又会触发一次 change 事件。 解决方法 1. 延迟更新 <template><div>选择日期--{…

LeetCode 热题 100 | 矩阵

矩阵基础 使用哈希数组来标记当前行或者列是否出现0按层模拟旋转90度可以先水平翻&#xff0c;然后再对角线翻 73. 矩阵置零 题目讲解&#xff1a;LeetCode 重点&#xff1a; 使用标记数组&#xff1a;用两个标记数组分别记录每一行和每一列是否有零出现。使用两个标记变量&…

Kaggle欺诈检测:使用生成对抗网络(GAN)解决正负样本极度不平衡问题

### Kaggle欺诈检测&#xff1a;使用生成对抗网络&#xff08;GAN&#xff09;解决正负样本极度不平衡问题 #### 引言 在金融领域中&#xff0c;欺诈检测是一项至关重要的任务。然而&#xff0c;欺诈交易数据往往呈现出正负样本极度不平衡的特点&#xff0c;这给机器学习模型…

leetcode 407. 接雨水 II

题目&#xff1a;407. 接雨水 II - 力扣&#xff08;LeetCode&#xff09; 堆bfs。 模拟水流出去的过程。先把边缘的单元都加到堆里&#xff0c;从堆顶最小的单元开始bfs&#xff0c;遍历到的单元的四周&#xff0c;都会从该单元流出去&#xff0c;四周的单元的剩余水量高度m…