当前位置: 首页 > wzjs >正文

网站建设销售职责做美缝在哪个网站接单

网站建设销售职责,做美缝在哪个网站接单,北京网站优化策略,网站建设手机端目录 第十四章:Android 多线程编程与异步任务机制(Handler、AsyncTask、线程池等) 🔸 14.1 为什么需要多线程? 🔸 14.2 Handler Thread 模型 ✦ 使用 Handler 与 Thread 进行线程通信 ✦ 简要说明&am…

目录

第十四章:Android 多线程编程与异步任务机制(Handler、AsyncTask、线程池等)

🔸 14.1 为什么需要多线程?

🔸 14.2 Handler + Thread 模型

✦ 使用 Handler 与 Thread 进行线程通信

✦ 简要说明:

🔸 14.3 Handler 消息机制详解

🔸 14.4 AsyncTask(适用于早期项目)

🔸 14.5 使用 Java 原生线程池(ThreadPoolExecutor)

✦ 优点:

🔸 14.6 Kotlin 开发推荐:协程 Coroutines(了解即可)

🔸 14.7 主线程中更新 UI 的常见方式总结

✅ 总结

小Demo(原来的习题板块)

项目结构

1. activity_main.xml

2. MainActivity.java

3. AndroidManifest.xml

代码说明

1. Handler + Thread 示例

2. AsyncTask 示例

3. 线程池示例

运行效果

总结


第十四章:Android 多线程编程与异步任务机制(Handler、AsyncTask、线程池等)


        Android 应用运行在单一的 UI 主线程(也叫 主线程 / UI Thread)上。为了避免阻塞界面、提升用户体验,我们需要将耗时操作(如网络请求、数据库访问、文件读写等)放到子线程中执行。本章将系统介绍 Android 中的多线程处理机制,包括 Handler、AsyncTask(已弃用但仍有参考意义)与线程池。


🔸 14.1 为什么需要多线程?

        在 Android 中,所有的 UI 更新必须在主线程中执行。如下操作若直接在主线程执行,可能导致 ANR(应用无响应):

  • 网络请求

  • 数据库操作

  • 大文件处理

  • 解码操作(如 Bitmap)


🔸 14.2 Handler + Thread 模型

✦ 使用 Handler 与 Thread 进行线程通信

Handler handler = new Handler(Looper.getMainLooper());new Thread(() -> {// 耗时操作(如模拟网络请求)try { Thread.sleep(2000); } catch (InterruptedException e) { }// 回到主线程更新 UIhandler.post(() -> {textView.setText("任务完成");});
}).start();

✦ 简要说明:

  • Thread:负责在子线程中执行耗时任务

  • Handler.post():用于将 UI 更新任务发送回主线程执行


🔸 14.3 Handler 消息机制详解

Handler handler = new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(Message msg) {if (msg.what == 1) {textView.setText("收到消息:" + msg.obj.toString());}}
};new Thread(() -> {Message message = handler.obtainMessage();message.what = 1;message.obj = "数据加载完成";handler.sendMessage(message);
}).start();


🔸 14.4 AsyncTask(适用于早期项目)

⚠️ 从 Android 11 开始已被官方标记为 deprecated,但仍可用于了解异步结构设计思路。

 
private class MyTask extends AsyncTask<Void, Void, String> {@Overrideprotected void onPreExecute() {// 主线程:任务开始前(初始化 UI)progressBar.setVisibility(View.VISIBLE);}@Overrideprotected String doInBackground(Void... voids) {// 子线程:执行耗时操作return "任务结果";}@Overrideprotected void onPostExecute(String result) {// 主线程:任务完成后(更新 UI)progressBar.setVisibility(View.GONE);textView.setText(result);}
}// 调用方式:
new MyTask().execute();


🔸 14.5 使用 Java 原生线程池(ThreadPoolExecutor)

ExecutorService executor = Executors.newFixedThreadPool(4);executor.execute(() -> {// 执行耗时任务String data = loadData();// 回主线程更新 UIrunOnUiThread(() -> textView.setText(data));
});

✦ 优点:

  • 避免频繁创建销毁线程

  • 支持并发执行多个任务

  • 适合批量任务,如多个图片下载


🔸 14.6 Kotlin 开发推荐:协程 Coroutines(了解即可)

虽然本书采用 Java 编写,但需要了解,Kotlin 开发中主流推荐使用协程 (CoroutineScope, launch, suspend 等),比 AsyncTask 和 Handler 更轻便灵活。


🔸 14.7 主线程中更新 UI 的常见方式总结

场景方法
Thread → 主线程Handler.post()runOnUiThread()
AsyncTask → 主线程onPostExecute()
ExecutorService → 主线程runOnUiThread()

✅ 总结

  • Android 中的 UI 必须在主线程更新,耗时任务需放入子线程执行

  • Handler 是 Android 最基础的线程通信工具

  • AsyncTask 封装了常见的异步模式(但已被弃用)

  • Executor 提供了线程池管理机制,适合并发任务

  • Kotlin 推荐使用协程,Java 可用线程池 + Handler 配合实现异步任务


📢 下一章预告:

第十五章:Android 动画机制详解(属性动画、帧动画、过渡动画)


小Demo(原来的习题板块)

项目结构

MainActivity.java
activity_main.xml
AndroidManifest.xml

1. activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:padding="16dp"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="点击按钮开始任务"android:textSize="18sp"android:gravity="center" /><ProgressBarandroid:id="@+id/progressBar"android:layout_width="wrap_content"android:layout_height="wrap_content"android:visibility="gone" /><Buttonandroid:id="@+id/btnHandler"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Handler + Thread 示例" /><Buttonandroid:id="@+id/btnAsyncTask"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="AsyncTask 示例" /><Buttonandroid:id="@+id/btnThreadPool"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="线程池示例" />
</LinearLayout>

2. MainActivity.java

package com.example.demo;import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class MainActivity extends AppCompatActivity {private TextView textView;private ProgressBar progressBar;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = findViewById(R.id.textView);progressBar = findViewById(R.id.progressBar);Button btnHandler = findViewById(R.id.btnHandler);Button btnAsyncTask = findViewById(R.id.btnAsyncTask);Button btnThreadPool = findViewById(R.id.btnThreadPool);// Handler + Thread 示例btnHandler.setOnClickListener(v -> startHandlerThreadExample());// AsyncTask 示例btnAsyncTask.setOnClickListener(v -> startAsyncTaskExample());// 线程池示例btnThreadPool.setOnClickListener(v -> startThreadPoolExample());}// Handler + Thread 示例private void startHandlerThreadExample() {progressBar.setVisibility(ProgressBar.VISIBLE);Handler handler = new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(Message msg) {if (msg.what == 1) {String result = (String) msg.obj;textView.setText(result);progressBar.setVisibility(ProgressBar.GONE);}}};new Thread(() -> {try {// 模拟耗时操作Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}// 发送消息到主线程Message message = handler.obtainMessage();message.what = 1;message.obj = "Handler + Thread 示例完成";handler.sendMessage(message);}).start();}// AsyncTask 示例private void startAsyncTaskExample() {new MyTask().execute();}private class MyTask extends AsyncTask<Void, Void, String> {@Overrideprotected void onPreExecute() {super.onPreExecute();progressBar.setVisibility(ProgressBar.VISIBLE);}@Overrideprotected String doInBackground(Void... voids) {try {// 模拟耗时操作Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return "AsyncTask 示例完成";}@Overrideprotected void onPostExecute(String result) {super.onPostExecute(result);textView.setText(result);progressBar.setVisibility(ProgressBar.GONE);}}// 线程池示例private void startThreadPoolExample() {progressBar.setVisibility(ProgressBar.VISIBLE);ExecutorService executor = Executors.newFixedThreadPool(4);executor.execute(() -> {try {// 模拟耗时操作Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}// 回到主线程更新 UIrunOnUiThread(() -> {textView.setText("线程池示例完成");progressBar.setVisibility(ProgressBar.GONE);});});}
}

3. AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.demo"><applicationandroid:allowBackup="true"android:label="多线程与异步任务示例"android:theme="@style/Theme.AppCompat.Light.DarkActionBar"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>
</manifest>

代码说明

1. Handler + Thread 示例
  • 使用 Handler 和 Thread 进行线程通信。
  • 子线程完成耗时任务后,通过 Handler 将结果发送回主线程更新 UI。
2. AsyncTask 示例
  • 使用 AsyncTask 执行耗时操作:
    • onPreExecute():在主线程中运行,用于初始化 UI。
    • doInBackground():在子线程中运行,执行耗时任务。
    • onPostExecute():在主线程中运行,用于更新 UI。
3. 线程池示例
  • 使用 ExecutorService 创建固定大小的线程池。
  • 子线程完成任务后,通过 runOnUiThread() 更新主线程 UI。

运行效果

  1. Handler + Thread 示例

    • 点击按钮后,进度条显示,2 秒后更新文本为“Handler + Thread 示例完成”。
  2. AsyncTask 示例

    • 点击按钮后,进度条显示,2 秒后更新文本为“AsyncTask 示例完成”。
  3. 线程池示例

    • 点击按钮后,进度条显示,2 秒后更新文本为“线程池示例完成”。

总结

  1. Handler 是线程间通信的基础工具,适合简单的线程交互。
  2. AsyncTask 已被弃用,但在旧项目中仍常见,适合轻量级异步任务。
  3. 线程池 提供更高效的线程管理,适合复杂的多线程场景。
  4. 在现代开发中,推荐使用 Kotlin 的协程(Coroutines)或 RxJava 来处理异步任务。


文章转载自:

http://LHVrekEU.qkLff.cn
http://zxnq8ymF.qkLff.cn
http://NzFgAYJK.qkLff.cn
http://8VjxsCHX.qkLff.cn
http://lh8Zh2Hb.qkLff.cn
http://BTa32U7K.qkLff.cn
http://kwpK2w3G.qkLff.cn
http://2gPhPN2Q.qkLff.cn
http://JPrerMRO.qkLff.cn
http://l41KovnX.qkLff.cn
http://XYGpImZq.qkLff.cn
http://hzN5gkGX.qkLff.cn
http://D0Xwmkt9.qkLff.cn
http://SuhP0VSx.qkLff.cn
http://1w2qtTO6.qkLff.cn
http://dxB1p4fr.qkLff.cn
http://G3w1zJC9.qkLff.cn
http://8KUOEMW7.qkLff.cn
http://QAOuq2DU.qkLff.cn
http://bq5WjsU3.qkLff.cn
http://L6V5sYHG.qkLff.cn
http://YhsIYDmh.qkLff.cn
http://1K3yg02D.qkLff.cn
http://nMQdKCxH.qkLff.cn
http://rmLrXW1h.qkLff.cn
http://S6OEHzqy.qkLff.cn
http://Af1nGV3Q.qkLff.cn
http://f1FPCum1.qkLff.cn
http://xSjTLpR7.qkLff.cn
http://dMNtZmPP.qkLff.cn
http://www.dtcms.com/wzjs/649053.html

相关文章:

  • 山东鲁为建设集团网站沈阳网站开发招聘
  • 如何利用dw建设网站域名如何做网站
  • 网站建设存在的问题及建议做网站页面一般设置多大尺寸
  • 江苏网站建设 seo网站建设域名提前买吗
  • 网站申请qq如何做关于网站推广的培训
  • 建设街小学网站鲜花网站开发背景
  • 网站建设合同书封皮石家庄高端网站建设
  • 网站风格定位有哪些做网站需要流程
  • 网站开发word文档鲁 网站 备案
  • 我的南京网站wordpress回复框无法加载
  • 建设部网站怎么查询相关专业主题 sku 推广
  • 用qt做网站可以吗营销式网站制作
  • 做网站维护有危险吗石家庄市官方网站
  • 网站新功能演示用什么技术做的wordpress被植入广告插件
  • 什么网站可以做论文网站建设首选原创先锋
  • 口腔网站设计图网站设计用ps 怎么做
  • 内蒙古建设安全监督网站网站建设的经费估算
  • 微博优惠券网站怎么做深圳网站建设软件开发公司哪家好
  • 怎样用dw做 网站首页腾讯云服务器搭建教程
  • 电子交易网站流程集团网站制作方案ppt
  • wordpress怎么适应手机端东莞企业seo推广
  • 做一个好一点网站费用多少微信小程序一键生成免费
  • 德州鲁企动力网站优化中心wordpress优化版
  • 网站建设应解决的问题新乡市网站建设有哪些公司
  • 做签名照的网站wordpress图像添加音频
  • 北京网站建设app中国十大电商平台排行榜
  • 建设银行融信通网站阿里巴巴1688大企业采购平台
  • 北京建设网站设计wordpress 慢途网主题
  • 济南黄河路桥建设集团官方网站做推广又能做网站
  • 与企业网站做接口网站建设需要哪些材料