1. 原理

每一个线程对应一个消息队列MessageQueue,实现线程之间的通信,可通过Handler对象将数据装进Message中,再将消息加入消息队列,而后线程会依次处理消息队列中的消息。
2. Message
初始化:一般使用Message.obtain()方法获取一个消息对象,该方法会检查Message对象池中是否存在可重复利用的对象,若无,才会new一个新对象。
what:相当于Message的标识符,区别于其它消息。
arg1、arg2:int类型,可传递整数。
obj:object类型,可传递任意对象。
3. 发送消息
在子线程中可调用主线程的handler.sendMessage(msg)进行发送消息,经过一系列方法调用,会触发handler的handleMessage方法,从而进行消息处理。
发送消息的主要方法:
handler.sendMessage(Message msg); handler.sendMessageAtTime(Message msg, int time); handler.sendMessageDelayed(Message msg, int time);
sendMessageAtTime()和sendMessageDelayed()区别在于前者是在指定时间发送消息,可配合SystemClock.uptimeMillis()使用;而后者则是延时发送消息。
除了SendMessage()方法以外,还可以通过post()方法发送消息:
handler.post(Runnable r); handler.postDelayed(Runnable r, int time);
sendMessage()与post()的区别:https://www./article/120624.htm
4. 内存泄漏
https://www./article/120627.htm
5. 通过Handler对象实现下载文件动态更新进度条
AndroidManifest加入权限声明:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="10dp" tools:context="com.studying.network.DownloadActivity"> <ProgressBar android:id="@+id/progress_bar" style="?android:progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="100" /> <Button android:id="@+id/download" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="@string/download" /> </LinearLayout>
Activity:
public class DownloadActivity extends Activity {
private static final int DOWNLOAD_MESSAGE_CODE = 100001;
private static final int DOWNLOAD_MESSAGE_FAIL_CODE = 100002;
private static final String APP_URL = "http://clfile.imooc.com/class/assist/119/1328281/Android%20Studio%20教辅%20.pdf";
private MyHandler mHandler;
private ProgressBar mProgressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_download);
findViewById(R.id.download).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//开启子线程
new Thread(new Runnable() {
@Override
public void run() {
download(APP_URL);
}
}).start();
}
});
mProgressBar = (ProgressBar) findViewById(R.id.progress_bar);
mHandler = new MyHandler(this);
}
private void download(String appUrl) {
try {
URL url = new URL(appUrl);
URLConnection conn = url.openConnection();
InputStream in = conn.getInputStream();
int contentLength = conn.getContentLength();//获取文件总大小
String downloadPath = Environment.getExternalStorageDirectory() + File.separator + "imooc" + File.separator;
File file = new File(downloadPath);
if (!file.exists()) {
file.mkdir();
}
String fileName = downloadPath + "test.pdf";
File apkFile = new File(fileName);
if (apkFile.exists()) {
apkFile.delete();
}
int downloadSize = 0;//记录已经下载的大小
byte[] bytes = new byte[1024];
int length = 0;
OutputStream out = new FileOutputStream(fileName);
while ((length = in.read(bytes)) != -1) {
out.write(bytes, 0, length);
downloadSize += length;
Message msg = Message.obtain();
msg.obj = downloadSize / contentLength * 100;//progress的值为0到100,因此得到的百分数要乘以100
msg.what = DOWNLOAD_MESSAGE_CODE;
mHandler.sendMessage(msg);
}
in.close();
out.close();
} catch (IOException e) {
notifyDownloadFailed();
e.printStackTrace();
}
}
private void notifyDownloadFailed() {
Message msg = Message.obtain();
msg.what = DOWNLOAD_MESSAGE_FAIL_CODE;
mHandler.sendMessage(msg);
}
private static class MyHandler extends Handler{
private WeakReference<DownloadActivity> weakReference;
MyHandler(DownloadActivity activity) {
this.weakReference = new WeakReference<>(activity);//以弱引用的形式传递Activity,避免内存泄漏
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
DownloadActivity activity = weakReference.get();
//消息处理
switch (msg.what) {
case DOWNLOAD_MESSAGE_CODE:
activity.mProgressBar.setProgress((Integer) msg.obj);
break;
case DOWNLOAD_MESSAGE_FAIL_CODE:
Toast.makeText(activity, "下载失败!", Toast.LENGTH_SHORT).show();
break;
}
}
}
}
总结
以上所述是小编给大家介绍的Handler实现线程之间的通信下载文件动态更新进度条,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# android
# handler线程之间的通信
# Android handler 详解(面试必问)
# 浅谈Android应用的内存优化及Handler的内存泄漏问题
# 详解Android中Handler的内部实现原理
# 详解Android中Handler的使用方法
# 发送消息
# 小编
# 装进
# 进度条
# 是在
# 还可以
# 在此
# 则是
# 才会
# 给大家
# 可通过
# 所述
# 再将
# 若无
# 给我留言
# 值为
# 感谢大家
# 是否存在
# 池中
# 教辅
相关文章:
如何零基础开发自助建站系统?完整教程解析
如何高效完成独享虚拟主机建站?
,交易猫的商品怎么发布到网站上去?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
建站之星好吗?新手能否轻松上手建站?
h5网站制作工具有哪些,h5页面制作工具有哪些?
C#怎么使用委托和事件 C# delegate与event编程方法
全景视频制作网站有哪些,全景图怎么做成网页?
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
无锡营销型网站制作公司,无锡网选车牌流程?
建站之星导航如何优化提升用户体验?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
清除minerd进程的简单方法
建站之星会员如何解锁更多建站功能?
如何快速查询网址的建站时间与历史轨迹?
如何选择网络建站服务器?高效建站必看指南
网站制作模板下载什么软件,ppt模板免费下载网站?
历史网站制作软件,华为如何找回被删除的网站?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
网站制作网站,深圳做网站哪家比较好?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
建站OpenVZ教程与优化策略:配置指南与性能提升
建站之星如何修改网站生成路径?
如何在香港服务器上快速搭建免备案网站?
建站之星如何实现PC+手机+微信网站五合一建站?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
如何选择建站程序?包含哪些必备功能与类型?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
微信小程序 input输入框控件详解及实例(多种示例)
如何在阿里云完成域名注册与建站?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
nginx修改上传文件大小限制的方法
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
如何用腾讯建站主机快速创建免费网站?
Python路径拼接规范_跨平台处理说明【指导】
如何快速上传建站程序避免常见错误?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
如何选择域名并搭建高效网站?
c# await 一个已经完成的Task会发生什么
淘宝制作网站有哪些,淘宝网官网主页?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
阿里云网站制作公司,阿里云快速搭建网站好用吗?
如何正确下载安装西数主机建站助手?
如何用PHP工具快速搭建高效网站?
官网网站制作腾讯审核要多久,联想路由器newifi官网
*请认真填写需求信息,我们会在24小时内与您取得联系。