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

淄博网站搭建公司/天津网站建设技术外包

淄博网站搭建公司,天津网站建设技术外包,班级网站怎么做,鞋材 技术支持 东莞网站建设1.什么是handler? Handler是Android SDK来处理异步消息的核心类。 子线程与主线程通过Handler来进行通信。子线程可以通过Handler来通知主线程进行UI更新。 Handler是Android中引入的一种让开发者参与处理线程中消息循环的机制。每个Hanlder都关联了一个线程,每个…

1.什么是handler?

Handler是Android SDK来处理异步消息的核心类。
子线程与主线程通过Handler来进行通信。子线程可以通过Handler来通知主线程进行UI更新。

Handler是Android中引入的一种让开发者参与处理线程中消息循环的机制。每个Hanlder都关联了一个线程,每个线程内部都维护了一个消息队列MessageQueue,这样Handler实际上也就关联了一个消息队列。可以通过Handler将Message和Runnable对象发送到该Handler所关联线程的MessageQueue(消息队列)中,然后该消息队列一直在循环拿出一个Message,对其进行处理,处理完之后拿出下一个Message,继续进行处理,周而复始。当创建一个Handler的时候,该Handler就绑定了当前创建Hanlder的线程。从这时起,该Hanlder就可以发送Message和Runnable对象到该Handler对应的消息队列中,当从MessageQueue取出某个Message时,会让Handler对其进行处理。

Handler可以用来在多线程间进行通信,在另一个线程中去更新UI线程中的UI控件只是Handler使用中的一种典型案例,除此之外,Handler可以做很多其他的事情。每个Handler都绑定了一个线程,假设存在两个线程ThreadA和ThreadB,并且HandlerA绑定了 ThreadA,在ThreadB中的代码执行到某处时,出于某些原因,我们需要让ThreadA执行某些代码,此时我们就可以使用Handler,我们可以在ThreadB中向HandlerA中加入某些信息以告知ThreadA中该做某些处理了。由此可以看出,Handler是Thread的代言人,是多线程之间通信的桥梁,通过Handler,我们可以在一个线程中控制另一个线程去做某事。
 

2.什么是MessageQueue和Looper

如图MessageQueue用来保存子线程从Handler所发送未处理的消息,Looper依次取出MessageQueue中的消息传递给主线程Hanlder响应处理。

3.为什么使用handler,MessageQueue,Looper?

主线程无法进行时间比较繁长的任务,所以需要子线程进行处理,然而子线程无法进行UI的界面更新,所以我们需要使用handler来传递消息给主线程,让其完成UI的更新。由于主线程和子线程进行不同的时间工作,所要需要用MessageQueue来存放子线程的消息,Looper取出消息交给主线程响应。

4.使用handler的主要步骤

Handler提供了两种方式解决我们在本文一开始遇到的问题(在一个新线程中更新主线程中的UI控件),一种是通过post方法,一种是调用sendMessage方法。

a. 使用post方法,代码如下:

package ispring.com.testhandler;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;public class MainActivity extends Activity implements Button.OnClickListener {private TextView statusTextView = null;//uiHandler在主线程中创建,所以自动绑定主线程private Handler uiHandler = new Handler();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);statusTextView = (TextView)findViewById(R.id.statusTextView);Button btnDownload = (Button)findViewById(R.id.btnDownload);btnDownload.setOnClickListener(this);System.out.println("Main thread id " + Thread.currentThread().getId());}@Overridepublic void onClick(View v) {DownloadThread downloadThread = new DownloadThread();downloadThread.start();}class DownloadThread extends Thread{@Overridepublic void run() {try{System.out.println("DownloadThread id " + Thread.currentThread().getId());System.out.println("开始下载文件");//此处让线程DownloadThread休眠5秒中,模拟文件的耗时过程Thread.sleep(5000);System.out.println("文件下载完成");//文件下载完成后更新UIRunnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("Runnable thread id " + Thread.currentThread().getId());MainActivity.this.statusTextView.setText("文件下载完成");}};uiHandler.post(runnable);}catch (InterruptedException e){e.printStackTrace();}}}
}

 我们在Activity中创建了一个Handler成员变量uiHandler,Handler有个特点,在执行new Handler()的时候,默认情况下Handler会绑定当前代码执行的线程,我们在主线程中实例化了uiHandler,所以uiHandler就自动绑定了主线程,即UI线程。当我们在DownloadThread中执行完耗时代码后,我们将一个Runnable对象通过post方法传入到了Handler中,Handler会在合适的时候让主线程执行Runnable中的代码,这样Runnable就在主线程中执行了,从而正确更新了主线程中的UI
b. 使用sendMessage方法,代码如下:

package ispring.com.testhandler;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;public class MainActivity extends Activity implements Button.OnClickListener {private TextView statusTextView = null;//uiHandler在主线程中创建,所以自动绑定主线程private Handler uiHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {switch (msg.what){case 1:System.out.println("handleMessage thread id " + Thread.currentThread().getId());System.out.println("msg.arg1:" + msg.arg1);System.out.println("msg.arg2:" + msg.arg2);MainActivity.this.statusTextView.setText("文件下载完成");break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);statusTextView = (TextView)findViewById(R.id.statusTextView);Button btnDownload = (Button)findViewById(R.id.btnDownload);btnDownload.setOnClickListener(this);System.out.println("Main thread id " + Thread.currentThread().getId());}@Overridepublic void onClick(View v) {DownloadThread downloadThread = new DownloadThread();downloadThread.start();}class DownloadThread extends Thread{@Overridepublic void run() {try{System.out.println("DownloadThread id " + Thread.currentThread().getId());System.out.println("开始下载文件");//此处让线程DownloadThread休眠5秒中,模拟文件的耗时过程Thread.sleep(5000);System.out.println("文件下载完成");//文件下载完成后更新UIMessage msg = new Message();//虽然Message的构造函数式public的,我们也可以通过以下两种方式通过循环对象获取Message//msg = Message.obtain(uiHandler);//msg = uiHandler.obtainMessage();//what是我们自定义的一个Message的识别码,以便于在Handler的handleMessage方法中根据what识别//出不同的Message,以便我们做出不同的处理操作msg.what = 1;//我们可以通过arg1和arg2给Message传入简单的数据msg.arg1 = 123;msg.arg2 = 321;//我们也可以通过给obj赋值Object类型传递向Message传入任意数据//msg.obj = null;//我们还可以通过setData方法和getData方法向Message中写入和读取Bundle类型的数据//msg.setData(null);//Bundle data = msg.getData();//将该Message发送给对应的HandleruiHandler.sendMessage(msg);}catch (InterruptedException e){e.printStackTrace();}}}
}

通过Message与Handler进行通信的步骤是:
1. 重写Handler的handleMessage方法,根据Message的what值进行不同的处理操作
2. 创建Message对象
虽然Message的构造函数式public的,我们还可以通过Message.obtain()或Handler.obtainMessage()来获得一个Message对象(Handler.obtainMessage()内部其实调用了Message.obtain())。
3. 设置Message的what值
Message.what是我们自定义的一个Message的识别码,以便于在Handler的handleMessage方法中根据what识别出不同的Message,以便我们做出不同的处理操作。
4. 设置Message的所携带的数据,简单数据可以通过两个int类型的field arg1和arg2来赋值,并可以在handleMessage中读取。
5. 如果Message需要携带复杂的数据,那么可以设置Message的obj字段,obj是Object类型,可以赋予任意类型的数据。或者可以通过调用Message的setData方法赋值Bundle类型的数据,可以通过getData方法获取该Bundle数据。
6. 我们通过Handler.sendMessage(Message)方法将Message传入Handler中让其在handleMessage中对其进行处理。
需要说明的是,如果在handleMessage中 不需要判断Message类型,那么就无须设置Message的what值;而且让Message携带数据也不是必须的,只有在需要的时候才需要让其携带数据;如果确实需要让Message携带数据,应该尽量使用arg1或arg2或两者,能用arg1和arg2解决的话就不要用obj,因为用arg1和arg2更高效。
 

http://www.jmfq.cn/news/5226355.html

相关文章:

  • 旅游网站设计风格/品牌seo是什么
  • 网页网站开发工具/长春网络优化哪个公司在做
  • 17一起做网站/郑州网络推广平台有哪些
  • 小说网站如何做seo关键词/seo网络排名优化
  • 学校的二级网站怎么建设/网络营销课程个人总结范文
  • 怎么找出网站的备案号/seo排名啥意思
  • 太原网站建设晋icp备/免费网络推广
  • 企业适合用模板网站/海外营销公司
  • 宝塔本地wordpress/上海优化公司有哪些
  • 竖导航网站/网络营销服务企业
  • 网站建设选择北京华网天下/百度 营销怎么收费
  • 长春做网站的电话/外贸营销
  • 长沙网站免费建站/焊工培训班
  • 网站的对比/网上卖货的平台有哪些
  • 济南网站开发建设/大白兔网络营销策划书
  • 呢图网站场建设封面/怎么注册电商平台
  • 哪些公司用.cc做网站/深圳网络整合营销公司
  • 商业空间设计案例ppt/seo推广排名公司
  • 机票网站建设/网站设计案例
  • js 网站怎么做中英文/关键词挖掘工具
  • 苏州网站建设 凡仕臣网络/微信推广图片
  • 网站描述优化/推广优化排名
  • wordpress 首页 修改/seo职业规划
  • 炫酷网站模板免费下载/营销策略ppt
  • 为女朋友做的网站/百度帐号管家
  • 大淘客网站推广位怎么做/西安百度推广代理商
  • 网站右侧固定标题怎么做/浏览器大全
  • 用织梦做网站能练技术吗/网络事件营销案例
  • 抖音代运营怎么解绑/seo搜索引擎优化培训班
  • 怎么建自己的手机网站吗/北京知名seo公司精准互联