1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| 在安卓开发中,多线程几乎是随时都会用到的,尤其是涉及 耗时操作 或 异步处理 的场景,否则主线程(UI线程)会被阻塞,导致卡顿甚至 ANR(应用无响应)。 1️⃣ 网络请求
原因:HTTP 请求、WebSocket、Socket 通信等都是耗时操作。
实现方式:
RxJava
OkHttp异步回调
Coroutine(Kotlin)
AsyncTask(过时)
new Thread(() -> { String result = httpRequest(); runOnUiThread(() -> textView.setText(result)); }).start();
2️⃣ 数据库操作
查询、插入、更新大量数据时,操作可能很慢。
实现方式:
Room + LiveData / RxJava / Coroutine
自己开子线程执行数据库操作
new Thread(() -> { List<User> users = db.userDao().getAllUsers(); runOnUiThread(() -> adapter.setData(users)); }).start();
3️⃣ 文件 I/O
读写本地文件、图片、视频、大数据文件。
大文件操作会阻塞主线程,必须放子线程。
ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(() -> { File file = new File(path); writeToFile(file, content); });
4️⃣ 图片加载 / 视频解码
Bitmap解码、视频帧处理、GIF播放。
常用工具:Glide、Fresco、ExoPlayer,本质都是在子线程处理。
5️⃣ 计时 / 定时任务
倒计时、定时上传数据、心跳包。
使用 Handler、ScheduledThreadPoolExecutor 或 TimerTask。
6️⃣ 复杂计算 / 算法
路径规划、图像处理、机器学习推理。
都要在子线程中执行,避免 UI 卡顿。
7️⃣ 消息 / 事件处理
子线程收到消息或数据,需要更新 UI。
用法:
Handler + Looper
runOnUiThread
View.post()
✅ 总结
多线程的本质目的是避免阻塞UI线程,凡是耗时操作、重复任务或异步事件,都会用到多线程。
|