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());
  }
  
 }

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值