Handler的使用简介

handler并不是重新启动一个线程,而是在主线程的基础上调用了run函数,实则还是在主线程中运行,真正的子线程是通过thread类调用start()实现的。
package com.yanjun;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;


/**handler消息队列的使用,实现异步消息的处理
* @author YanJun
*post()---将线程加入消息队列
*removeCallbacks()---将线程从消息队列中移除
*postDelayed()---以先进先出的形式执行线程队列
*/
public class HandlerActivity extends Activity {
         /** Called when the activity is first created. */
   private Button startButton ;
   private Button endButton;
        @Override
         public void onCreate(Bundle savedInstanceState) {
                 super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                 //根据控件的ID得到空间的对象
                startButton = (Button) findViewById(R.id.button_start);
                endButton = (Button) findViewById(R.id.button_end);
                 //监听事件
                startButton.setOnClickListener( new startButtonListener());    
                endButton.setOnClickListener( new endButtonListener());
        }
         class startButtonListener implements OnClickListener{

     public void onClick(View v) {
       // 将线程对象加入线程对列----post()
      handler.post(runnable);
    }
            
        }
         class endButtonListener implements OnClickListener{

     public void onClick(View v) {
       //移除线程对象---removeCallbacks()
      handler.removeCallbacks(runnable);
    }
            
        }
         //创建handler对象
        Handler handler = new Handler();
         //将要执行的操作写在线程对象的run()当中
        Runnable runnable = new Runnable() {
    
     public void run() {
      System.out.println( "大量复杂的操作如:下载等");
       //将线程加入到线程队列中----先进先出----postDelayed()或者post()
      handler.postDelayed(runnable, 3000);
       //执行post()没有时间间隔,运行会很快
     //  handler.post(runnable);
    }
  };
}
handler与进度条
package com.yanjun;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;

public class Handler_ProgressBarActivity extends Activity {
   /**运行时效果实现了,但是出现了死循环 */
  Button start = null;
   // 进度条的最大值是100
  ProgressBar progressBar = null;

  @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    start = (Button) findViewById(R.id.button_start);
    progressBar = (ProgressBar) findViewById(R.id.progressBar1);
    start.setOnClickListener( new start());
  }

   class start implements OnClickListener {
     // 当点击按钮时会触发监听事件
     public void onClick(View v) {
       // 组件在XML中将Visibility设置为gone
      progressBar.setVisibility(View.VISIBLE); // 将隐藏的进度条可视化
      updataBarHandler.post(runnable);
    }

  }

   // 使用匿名内部类来重写handler中的handleMessage()
  Handler updataBarHandler = new Handler() {
     // handleMessage取出消息队列的方法
    @Override
     public void handleMessage(Message msg) {
       // 设置progressBar的当前值
      progressBar.setProgress(msg.arg1);
       // 获得包含消息队列的线程队列
      updataBarHandler.post(runnable);
    }

  };

   // 线程类,该类以匿名内部类的方式进行声明
  Runnable runnable = new Runnable() {
     int i = 0;

     public void run() {
      System.out.println( "进度条开始执行");
      i = i + 10;
       // 得到一个消息队列Message通过updataBarHandler.obtainMessage()得到该对象
       // 通过arg1参数得到对象的优点:系统性能消耗少
      Message msg = updataBarHandler.obtainMessage();
       // 将message的arg1参数的值设置为i
      msg.arg1 = i;
       try {
        Thread.sleep(1000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
       // 将消息队列加入到线程中去
      updataBarHandler.sendMessage(msg);
       if (i == 50) {
         // 满足条件后去掉handler中的线程对象runnable
        updataBarHandler.removeCallbacks(runnable);
      }
    }
  };
}
线程与handler的关系-----界面延时显示
package com.yanjun;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;

/**handler消息队列的使用,实现异步消息的处理
* @author YanJun
*post()---将线程加入消息队列
*removeCallbacks()---将线程从消息队列中移除
*postDelayed()---以先进先出的形式执行线程队列
*/
public class HandlerActivity extends Activity {
        
        @Override
         public void onCreate(Bundle savedInstanceState) {
                 super.onCreate(savedInstanceState);
             handler.post(runnable);
                setContentView(R.layout.main);
            System.out.println( "主线程id"+Thread.currentThread().getId());
            System.out.println( "主线程名称"+Thread.currentThread().getName());
        }
     Handler handler    = new Handler();
     Runnable runnable = new Runnable() {
    
   public void run() {
     // TODO Auto-generated method stub
     try {
      Thread.sleep(5000);
    } catch (InterruptedException e) {
       // TODO Auto-generated catch block
      e.printStackTrace();
    }
    System.out.println( "handler"+Thread.currentThread().getId());
    System.out.println( "handler"+Thread.currentThread().getName());
  }
};
}

你可能感兴趣的:(handler,使用简介)