全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Handler实现线程之间的通信下载文件动态更新进度条

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小时内与您取得联系。