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

  

  

每一个线程对应一个消息队列MessageQueue,实现线程之间的通信,可通过处理程序对象将数据装进消息中,再将消息加入消息队列,而后线程会依次处理消息队列中的消息。

  

  

初始化:一般使用Message.obtain()方法获取一个消息对象,该方法会检查消息对象池中是否存在可重复利用的对象,若无,才会新一个新对象。

  

:什么相当于消息的标识符,区别于其它消息。

  

__arg1、最长:int类型,可传递整数。

  

obj:对象类型,可传递任意对象。

  

  

在子线程中可调用主线程的<代码> handler.sendMessage(味精)进行发送消息,经过一系列方法调用,会触发处理程序的handleMessage方法,从而进行消息处理。

  

发送消息的主要方法:

        处理程序。消息味精sendMessage ();   处理程序。sendMessageAtTime(消息味精,int时间);   处理程序。sendMessageDelayed(消息味精,int);      

<代码> sendMessageAtTime() 和<代码> sendMessageDelayed() 区别在于前者是在指定时间发送消息,可配合<代码> SystemClock.uptimeMillis() 使用;而后者则是延时发送消息。

  

除了SendMessage()方法以外,还可以通过post()方法发送消息:

        处理程序。帖子(Runnable r);   处理程序。postDelayed (Runnable r, int);      

sendMessage()与()的后区别:https://www.jb51.net/article/120624.htm

  

4。内存泄漏

  https://www.jb51.net/article/120627.htm

  

5。通过处理程序对象实现下载文件动态更新进度条

  

AndroidManifest加入权限声明:

        & lt; uses-permission android: name=" android.permission。互联网”/比;   & lt; uses-permission android: name=" android.permission。WRITE_EXTERNAL_STORAGE”/比;   & lt; uses-permission android: name=" android.permission。READ_EXTERNAL_STORAGE "/祝辞      

布局:         & lt; & # 63; xml version=" 1.0 " encoding=" utf - 8 " & # 63;比;   & lt; LinearLayout xmlns: android=" http://schemas.android.com/apk/res/android "   xmlns:工具=" http://schemas.android.com/tools "   android: layout_width=" match_parent "   android: layout_height=" match_parent "   android:取向=按怪薄?   android:填充=" 10 dp”   工具:上下文=癱om.studying.network.DownloadActivity”比;   & lt; ProgressBar   android: id=癅 + id/progress_bar”      android: layout_width=" match_parent "   android: layout_height=" wrap_content "   android: max=" 100 "/比;   & lt;按钮   android: id=癅 + id/下载”   android: layout_width=" match_parent "   android: layout_height=" wrap_content "   android: layout_marginTop=" 10 dp”   android:文本=癅string/下载/比;   & lt;/LinearLayout>      

活动:         公开课DownloadActivity延伸活动{   私有静态最终int DOWNLOAD_MESSAGE_CODE=100001;   私有静态最终int DOWNLOAD_MESSAGE_FAIL_CODE=100002;   私有静态最终字符串APP_URL=" http://clfile.imooc.com/class/assist/119/1328281/Android%20Studio%20教辅% 20. pdf”;   私人MyHandler mHandler;   私人ProgressBar mProgressBar;   @Override   保护无效onCreate(包savedInstanceState) {   super.onCreate (savedInstanceState);   setContentView (R.layout.activity_download);   findViewById (R.id.download)。setOnClickListener(新View.OnClickListener () {   @Override   公共空间onClick(查看v) {//开启子线程   新线程(新Runnable () {   @Override   公共空间run () {   下载(APP_URL);   }   }) .start ();   }   });   mProgressBar=(ProgressBar) findViewById (R.id.progress_bar);   mHandler=new MyHandler(这个);   }   私人空间下载(字符串appUrl) {   尝试{   网址URL=new URL (appUrl);   URLConnection康涅狄格州=url.openConnection ();   InputStream的=conn.getInputStream ();   int contentLength=conn.getContentLength();//获取文件总大小   字符串downloadPath=Environment.getExternalStorageDirectory() +文件。分离器+“imooc”+ File.separator;   文件文件=新文件(downloadPath);   如果(! file.exists ()) {   file.mkdir ();   }   字符串文件名=downloadPath +“test.pdf”;   文件apkFile=新文件(文件名);   如果(apkFile.exists ()) {   apkFile.delete ();   }   int downloadSize=0;//记录已经下载的大小   byte[]字节=新字节[1024];   int长度=0;   OutputStream=新FileOutputStream(文件名);   在((=in.read长度(字节)!=1){   出去了。写(字节0长度);   downloadSize +=长度;   消息味精=Message.obtain ();   味精。obj=downloadSize/contentLength * 100;//进展的值为0到100,因此得到的百分数要乘以100   味精。什么=DOWNLOAD_MESSAGE_CODE;   mHandler.sendMessage(味精);   }   in.close ();   out.close ();   }捕捉(IOException e) {   notifyDownloadFailed ();   e.printStackTrace ();   }   }   私人空间notifyDownloadFailed () {   消息味精=Message.obtain ();   味精。什么=DOWNLOAD_MESSAGE_FAIL_CODE;   mHandler.sendMessage(味精);   }   私有静态类MyHandler扩展处理程序{   私人WeakReference

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