zoukankan      html  css  js  c++  java
  • android Handler post sendMessage

    Handler 为Android操作系统中的线程通信工具,包为android.os.Handler。

    与Handler绑定的有两个队列,一个为消息队列,另一个为线程队列。Handler可以通过这两个队列来分别:

    1. 发送、接受、处理消息–消息队列;
    2. 启动、结束、休眠线程–线程队列;

    Android OS中,一个进程被创建之后,主线程(可理解为当前Activity)创建一个消息队列,这个消息队列维护所有顶层应用对象(Activities, Broadcast receivers等)以及主线程创建的窗口。你可以在主线程中创建新的线程,这些新的线程都通过Handler与主线程进行通信。通信通过新线程调用 Handler的post()方法和sendMessage()方法实现,分别对应功能:

    1. post()  将一个线程加入线程队列;
    2. sendMessage() 发送一个消息对象到消息队列;

    当然,post()方法还有一些变体,比如postDelayed()、postAtTime()分别用来延迟发送、定时发送;

    消息的处理,在主线程的Handler对象中进行;具体处理过程,需要在new Handler对象时使用匿名内部类重写Handler的handleMessage(Message msg)方法;

    线程加入线程队列可以在主线程中也可以在子线程中进行,但都要通过主线程的Handler对象调用post()。

    下面我以一个进度条Demo来展示Handler的使用,每隔2000ms就使进度条进一格,先预览下程序结构图:

    [1] main.xml中的布局文件源码如下:

    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:orientation="vertical"  
    4.     android:layout_width="fill_parent"  
    5.     android:layout_height="fill_parent"  
    6.     >  
    7. <TextView    
    8.     android:layout_width="fill_parent"   
    9.     android:layout_height="wrap_content"   
    10.     android:textSize="16sp"  
    11.     android:text="Hello , This is Andy's blog !"/>  
    12.     <Button  
    13.        android:id="@+id/start"  
    14.        android:layout_width="fill_parent"  
    15.        android:layout_height="wrap_content"  
    16.        android:text="Start"/>  
    17.     <Button  
    18.        android:id="@+id/end"  
    19.        android:layout_width="fill_parent"  
    20.        android:layout_height="wrap_content"  
    21.        android:text="End"/>    
    22.     <ProgressBar  
    23.        android:id="@+id/pBar"  
    24.        android:layout_width="fill_parent"  
    25.        android:layout_height="wrap_content"  
    26.        style="?android:attr/progressBarStyleHorizontal"  
    27.        mce_style="?android:attr/progressBarStyleHorizontal"  
    28.        android:visibility="gone"/>  
    29. </LinearLayout>  

    [2] HandlerActivity.java中的源码如下:

    1. package com.andyidea.handlerdemo;  
    2.   
    3. import android.app.Activity;  
    4. import android.os.Bundle;  
    5. import android.os.Handler;  
    6. import android.os.Message;  
    7. import android.util.Log;  
    8. import android.view.View;  
    9. import android.widget.Button;  
    10. import android.widget.ProgressBar;  
    11.   
    12. public class HandlerActivity extends Activity {  
    13.       
    14.     Button btnStart,btnEnd;  
    15.     ProgressBar proBar;  
    16.       
    17.     /** Called when the activity is first created. */  
    18.     @Override  
    19.     public void onCreate(Bundle savedInstanceState) {  
    20.         super.onCreate(savedInstanceState);  
    21.         setContentView(R.layout.main);  
    22.           
    23.         //通过控件的ID来实例化控件对象  
    24.          btnStart = (Button)findViewById(R.id.start);  
    25.         btnEnd = (Button)findViewById(R.id.end);  
    26.         proBar = (ProgressBar)findViewById(R.id.pBar);  
    27.           
    28.         //开始按钮触发事件  
    29.         btnStart.setOnClickListener(new View.OnClickListener() {  
    30.               
    31.             @Override  
    32.             public void onClick(View v) {  
    33.                 proBar.setVisibility(View.VISIBLE);  
    34.                 updateBarHandler.post(updateBarThread);  
    35.             }  
    36.         });  
    37.           
    38.         //结束按钮触发事件  
    39.         btnEnd.setOnClickListener(new View.OnClickListener() {  
    40.               
    41.             @Override  
    42.             public void onClick(View v) {  
    43.                 updateBarHandler.removeCallbacks(updateBarThread);  
    44.             }  
    45.         });  
    46.     }  
    47.       
    48.       
    49.      //创建一个Handler对象  
    50.      Handler updateBarHandler = new Handler(){  
    51.   
    52.         @Override  
    53.         public void handleMessage(Message msg) {  
    54.             proBar.setProgress(msg.arg1);  
    55.             updateBarHandler.post(updateBarThread);  
    56.         }  
    57.           
    58.     };  
    59.       
    60.     //更新ProgressBar的线程对象  
    61.     Runnable updateBarThread = new Runnable() {  
    62.         int i = 0;  
    63.         @Override  
    64.         public void run() {  
    65.             ii = i + 10;  
    66.             Message msg = updateBarHandler.obtainMessage();  
    67.             msg.arg1 = i;  
    68.             try{  
    69.                 Thread.sleep(2000);  
    70.             }catch (InterruptedException e) {  
    71.                 e.printStackTrace();  
    72.             }  
    73.             updateBarHandler.sendMessage(msg);  
    74.             if(i == 100){  
    75.                 updateBarHandler.removeCallbacks(updateBarThread);  
    76.             }  
    77.         }  
    78.     };  
    79. }  

    程序运行的截图如下:

    注:在主线程HandlerActivity中,通过Handler对象将updateBarThread子线程对象添加到主线程的队列中,并不是另外开启了一个新的线程去执行

  • 相关阅读:
    web服务器-Apache
    nginx优化
    nginx下载限速
    nginx-URL重写
    HDU 5358 First One 求和(序列求和,优化)
    HDU 5360 Hiking 登山 (优先队列,排序)
    HDU 5353 Average 糖果分配(模拟,图)
    UVALive 4128 Steam Roller 蒸汽式压路机(最短路,变形) WA中。。。。。
    HDU 5348 MZL's endless loop 给边定向(欧拉回路,最大流)
    HDU 5344 MZL's xor (水题)
  • 原文地址:https://www.cnblogs.com/bdbw2012/p/4582822.html
Copyright © 2011-2022 走看看