每一个线程对应一个消息队列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处理程序实现线程之间的通信下载文件动态更新进度条