Handler类.docx

上传人:b****4 文档编号:6152775 上传时间:2023-05-09 格式:DOCX 页数:9 大小:16.31KB
下载 相关 举报
Handler类.docx_第1页
第1页 / 共9页
Handler类.docx_第2页
第2页 / 共9页
Handler类.docx_第3页
第3页 / 共9页
Handler类.docx_第4页
第4页 / 共9页
Handler类.docx_第5页
第5页 / 共9页
Handler类.docx_第6页
第6页 / 共9页
Handler类.docx_第7页
第7页 / 共9页
Handler类.docx_第8页
第8页 / 共9页
Handler类.docx_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Handler类.docx

《Handler类.docx》由会员分享,可在线阅读,更多相关《Handler类.docx(9页珍藏版)》请在冰点文库上搜索。

Handler类.docx

Handler类

*Handler的定义:

  *主要接受子线程发送的数据,并用此数据配合主线程更新UI。

当应用程序启动时,

  *Android首先会开启一个主线程(也就是UI线程),主线程为管理界面中的UI控件,进行事件分发,比如说,

  *你要是点击一个Button,Android会分发事件到Button上,来响应你的操作。

  *如果此时需要一个耗时的操作,例如:

联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,

  *如果你放在主线程中的话,界面会出现假死现象,如果5秒钟还没有完成的话,会收到Android系统的一个错误提示"强制关闭"。

  *这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,

  *也就是说,更新UI只能在主线程中更新,子线程中操作是危险的。

这个时候,Handler就出现了,来解决这个复杂的问题,

  *由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,

  *这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象(里面包含数据),把这些消息放入主线程队列中,配合主线程进行更新UI。

  *Handler一些特点:

  *Handler可以分发Message对象和Runnable对象到主线程中,每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),

  *它有两个作用:

(1):

安排消息或Runnable在某个主线程中某个地方执行,

(2)安排一个动作在不同的线程中执行

  *Handler中分发消息的一些方法

  *post(Runnable)

  *postAtTime(Runnable,long)

  *postDelayed(Runnable,long)

  *sendEmptyMessage(int)

  *sendMessage(Message)

  *sendMessageAtTime(Message,long)

  *sendMessageDelayed(Message,long)

  *以上post类方法允许你排列一个Runnable对象到主线程队列中,当需要在不同于主UI线程中执行则需要配合HandlerThread进行使用:

  *HandlerThreadhandlerThread=newHandlerThread("myHandlerThread");

  *handlerThread.start();

  *handler=newHandler(handlerThread.getLooper());*sendMessage类方法,允许你安排一个带数据的Message对象到队列中,等待更新.

  *@authorxiaoshuang

  *

  */

  publicclassHandlerActivityextendsActivity{

  privateTextViewtextView;

  privateMyHandlermyHandler;

  privateButtonbutton;

  privateProgressBarprogressBar;

  privateMyThreadm=newMyThread();

  /**Calledwhentheactivityisfirstcreated.*/

  @Override

  publicvoidonCreate(BundlesavedInstanceState){

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  textView=(TextView)findViewById(R.id.text);

  button=(Button)findViewById(R.id.startButton);

  progressBar=(ProgressBar)findViewById(R.id.bar);

  progressBar.setMax(100);

  button.setOnClickListener(newView.OnClickListener(){

  @Override

  publicvoidonClick(Viewarg0){

  myHandler=newMyHandler();

  newThread(m).start();

  System.out.println("onCreate--TheThreadis:

"+Thread.currentThread().getId());

  }

  });

  }

  //在对UI进行更新时,执行时所在的线程为主UI线程

  classMyHandlerextendsHandler{//继承Handler类时,必须重写handleMessage方法

  publicMyHandler(){

  }

  publicMyHandler(Looperl){

  super(l);

  }

  @Override

  publicvoidhandleMessage(Messagemsg){//执行接收到的通知,此时执行的顺序是按照队列进行,即先进先出

  System.out.println("Handler--TheThreadIdis:

"+Thread.currentThread().getId());

  super.handleMessage(msg);

  Bundleb=msg.getData();

  StringtextStr0=textView.getText().toString();

  StringtextStr1=b.getString("textStr");

  HandlerActivity.this.textView.setText(textStr0+""+textStr1);//更改TextView中的值

  intbarValue=b.getInt("barValue");HandlerActivity.this.progressBar.setProgress(barValue);//更改进度条当中的值

  }

  }

  //该线程将会在单独的线程中运行

  classMyThreadimplementsRunnable{

  inti=1;

  @Override

  publicvoidrun(){

  while(i<11){

  System.out.println("Thread--TheThreadIdis:

"+Thread.currentThread().getId());

  try{

  Thread.sleep(1000);

  }catch(InterruptedExceptione){

  e.printStackTrace();

  }

  Messagemsg=newMessage();

  Bundleb=newBundle();

  b.putString("textStr","线程运行"+i+"次");

  b.putInt("barValue",i*10);

  i++;

  msg.setData(b);

  HandlerActivity.this.myHandler.sendMessage(msg);//通过sendMessage向Handler发送更新UI的消息

  }

  }

  }

  }

  /***

  *Handler的定义:

  *主要接受子线程发送的数据,并用此数据配合主线程更新UI。

当应用程序启动时,

  *Android首先会开启一个主线程(也就是UI线程),主线程为管理界面中的UI控件,进行事件分发,比如说,

  *你要是点击一个Button,Android会分发事件到Button上,来响应你的操作。

  *如果此时需要一个耗时的操作,例如:

联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,

  *如果你放在主线程中的话,界面会出现假死现象,如果5秒钟还没有完成的话,会收到Android系统的一个错误提示"强制关闭"。

  *这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,

  *也就是说,更新UI只能在主线程中更新,子线程中操作是危险的。

这个时候,Handler就出现了,来解决这个复杂的问题,

  *由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,

  *这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象(里面包含数据),把这些消息放入主线程队列中,配合主线程进行更新UI。

*Handler一些特点:

  *Handler可以分发Message对象和Runnable对象到主线程中,每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),

  *它有两个作用:

(1):

安排消息或Runnable在某个主线程中某个地方执行,

(2)安排一个动作在不同的线程中执行

  *Handler中分发消息的一些方法

  *post(Runnable)

  *postAtTime(Runnable,long)

  *postDelayed(Runnable,long)

  *sendEmptyMessage(int)

  *sendMessage(Message)

  *sendMessageAtTime(Message,long)

  *sendMessageDelayed(Message,long)

  *以上post类方法允许你排列一个Runnable对象到主线程队列中,当需要在不同于主UI线程中执行则需要配合HandlerThread进行使用:

  *HandlerThreadhandlerThread=newHandlerThread("myHandlerThread");

  *handlerThread.start();

  *handler=newHandler(handlerThread.getLooper());

  *sendMessage类方法,允许你安排一个带数据的Message对象到队列中,等待更新.

  *@authorxiaoshuang

  *

  */

  publicclassHandlerActivityextendsActivity{

  privateTextViewtextView;

  privateMyHandlermyHandler;

  privateButtonbutton;

  privateProgressBarprogressBar;

  privateMyThreadm=newMyThread();

  /**Calledwhentheactivityisfirstcreated.*/

  @Override

  publicvoidonCreate(BundlesavedInstanceState){

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  textView=(TextView)findViewById(R.id.text);

  button=(Button)findViewById(R.id.startButton);

  progressBar=(ProgressBar)findViewById(R.id.bar);

  progressBar.setMax(100);

  button.setOnClickListener(newView.OnClickListener(){

  @Override

  publicvoidonClick(Viewarg0){

  myHandler=newMyHandler();

  newThread(m).start();

  System.out.println("onCreate--TheThreadis:

"+Thread.currentThread().getId());

  }

  });

  }

  //在对UI进行更新时,执行时所在的线程为主UI线程

  classMyHandlerextendsHandler{//继承Handler类时,必须重写handleMessage方法

  publicMyHandler(){

  }

  publicMyHandler(Looperl){

  super(l);

  }

  @Override

  publicvoidhandleMessage(Messagemsg){//执行接收到的通知,此时执行的顺序是按照队列进行,即先进先出

  System.out.println("Handler--TheThreadIdis:

"+Thread.currentThread().getId());

  super.handleMessage(msg);

  Bundleb=msg.getData();

  StringtextStr0=textView.getText().toString();

  StringtextStr1=b.getString("textStr");

  HandlerActivity.this.textView.setText(textStr0+""+textStr1);//更改TextView中的值

  intbarValue=b.getInt("barValue");

  HandlerActivity.this.progressBar.setProgress(barValue);//更改进度条当中的值

  }

  }

  //该线程将会在单独的线程中运行

  classMyThreadimplementsRunnable{

  inti=1;

  @Override

  publicvoidrun(){

  while(i<11){

  System.out.println("Thread--TheThreadIdis:

"+Thread.currentThread().getId());

  try{

  Thread.sleep(1000);

  }catch(InterruptedExceptione){

  e.printStackTrace();

  }

  Messagemsg=newMessage();

  Bundleb=newBundle();

  b.putString("textStr","线程运行"+i+"次");

  b.putInt("barValue",i*10);

  i++;

  msg.setData(b);

  HandlerActivity.this.myHandler.sendMessage(msg);//通过sendMessage向Handler发送更新UI的消息

  }

  }

  }

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2