android之handler

这是一个关于handler的例子,简单实现了handler的用法。

package com.yx.handlerforprogressbar;

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

public class MainActivity extends Activity {

 private Button barButton;
 private ProgressBar bar;
 
 private int bargo = 0;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  barButton = (Button) findViewById(R.id.barButton);
  barButton.setOnClickListener(new BarButtonListener());
  bar = (ProgressBar) findViewById(R.id.bar);
  
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }
 
 class BarButtonListener implements OnClickListener{

  @Override
  public void onClick(View v) {
   // TODO Auto-generated method stub
   handler.post(barThread);
  
  }
  
 }
 //使用匿名内部;类复写其中handlerMessage方法
 Handler handler = new Handler(){
  @Override
  public void handleMessage(Message msg) {

   bar.setProgress(msg.arg1);
   handler.post(barThread);//将barThread压入到线程队列中
  }
 };
 Runnable barThread = new Runnable() {
  int i=0;
  @Override
  public void run() {
   // 方法一
   /*
   if(bargo<bar.getMax()){
    System.out.println("barThread");
    bar.setProgress(++bargo);
    handler.postDelayed(barThread, 1000);
   }*/
   //方法二
   i=i+10;
   //得到一个消息对象,message对象由android系统提供。
   Message msg = handler.obtainMessage();
   //用arg1和arg2两个成员变量传递消息,优点是系统性能消耗较少
   msg.arg1 = i;
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   handler.sendMessage(msg);//将msg压入到message队列中
   if(i==100){//100为进度条默认的最大值
    handler.removeCallbacks(barThread);
   }
  }
 };

}
在上面代码中仅仅是实现了handler的用法,但是在android机制中handler是在主线程中运行的。这并不是我们期望的。

一下代码可以使线程分开。

package com.yx.handlerforprogressbar;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;

public class HandlerTest2Activity extends Activity{

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  //打印当前线程的id
  System.out.println("activityID-->"+Thread.currentThread().getId());
  System.out.println("activityNAME-->"+Thread.currentThread().getName());
  //生成一个HandlerThread对象,实现使用looper来处理消息队列的功能
  HandlerThread thread = new HandlerThread("handler_thread");
  thread.start();
  //在使用getLooper()之前,必须先start线程,否则getLooper()为null
  MyHandler myHandler = new MyHandler(thread.getLooper());
  Message msg = myHandler.obtainMessage();
  
  /*传递数据
   * msg.arg1;
  msg.arg2;
  msg.obj="sss";
  msg.setData(data);//bandle对象,类似于map数组
  */
  msg.sendToTarget();//message 传递数据
 }
 
 class MyHandler extends Handler{

  //两个构造函数
  public MyHandler(){}
  public MyHandler(Looper looper){
   super(looper);
  }
  
  @Override
  public void handleMessage(Message msg) {
   System.out.println("MyHandlerID-->"+Thread.currentThread().getId());
   System.out.println("MyHandlerNAME-->"+Thread.currentThread().getName());
  }
  
 }

}

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。