android应用开发笔记---_Handler的使用

相关代码

package mars.barhandler;

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 TestBarHandler extends Activity {
    /** Called when the activity is first created. */
	//声明控件变量
	ProgressBar bar = null;
	Button startButton = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //根据控件的ID得到代表控件的对象,并为按钮设置监听器
        bar = (ProgressBar)findViewById(R.id.bar);
        startButton = (Button)findViewById(R.id.startButton);
        startButton.setOnClickListener(new ButtonListener());
    }
    //当点击startButton按钮时,就会执行ButtonListener的onClick方法
    class ButtonListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			bar.setVisibility(View.VISIBLE);
			updateBarHandler.post(updateThread);
		}
    	
    }
    //使用匿名内部类来复写Handler当中的handleMessage方法
    Handler updateBarHandler = new Handler(){

		@Override
		public void handleMessage(Message msg) {
			bar.setProgress(msg.arg1);
			Bundle bundle = msg.getData();
			updateBarHandler.post(updateThread);//把这个线程加入消息队列
			System.out.println("test---->" + bundle.getString("test"));
		}
    	
    };
    //线程类,该类使用匿名内部类的方式进行声明
    Runnable updateThread = new Runnable(){
    	int i = 0 ;
		@Override
		public void run() {
			System.out.println("Begin Thread" + i);
			i = i + 10 ;
			//得到一个消息对象,Message类是有Android操作系统提供
			Message msg = updateBarHandler.obtainMessage();
			
			//将msg对象的arg1参数的值设置为i,用arg1和arg2这两个成员变量传递消息,优点是系统性能消耗较少
			msg.arg1 = i ;
			Bundle bundle = new Bundle();
			bundle.putString("test", "test bundle");
			msg.setData(bundle);
			try {
				//设置当前显示睡眠1秒
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//将msg对象加入到消息队列当中
			if( i > 100){
				//如果当i的值为100时,就将线程对象从handler当中移除
				updateBarHandler.removeCallbacks(updateThread);
				System.out.println(">>>>>>");
			}else{
				updateBarHandler.sendMessage(msg);
				System.out.println("<<<<<<");
			}
		}
    };
    class MyThread extends Thread{
    	public void run(){
    		
    	}
    }
    
}

onClick把线程加入线程队列,执行线程时把消息送到消息队列,在消息队列handleMessage,设置进度条,再把线程加入线程队列,这么循环

相关布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

<ProgressBar
	android:id="@+id/bar"
	style="?android:attr/progressBarStyleHorizontal"
	android:layout_width="200dp"
	android:layout_height="wrap_content"
	android:visibility="gone"
	/>
<Button 
	android:id="@+id/startButton"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="start"/>
</LinearLayout>



handle与调用它的线程处于同一线程,上面那个例子只是实现了Runnable,没有调用 start函数,post实际上是直接调用了这个函数的run方法

以一个例子测试

package mars.handler;

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

public class HandlerTest extends Activity {
	private Handler handler = new Handler();
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// sendMessage();
		handler.post(r);
		setContentView(R.layout.main);
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("a--->" + System.currentTimeMillis());
		//Thread t = new Thread(r) ;
		//t.start();
		System.out.println("activity--->" + Thread.currentThread().getId());
		System.out.println("activityname--->" + Thread.currentThread().getName());
	}
	
	
	Thread r = new Thread(){
		@Override
		public void start(){
			System.out.println("start---------");
			super.start();
		}
		@Override
		public void run() {
			System.out.println("r1--->" + System.currentTimeMillis());
			// TODO Auto-generated method stub
			System.out.println("handler--->" + Thread.currentThread().getId());
			System.out.println("handlername--->" + Thread.currentThread().getName());
			try {
				Thread.sleep(10000);
				System.out.println("r2---?" + System.currentTimeMillis());
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	};

}


打印当前线程 的ID,activity延长了10s才显示出来 ,因为调用了run方法,里面睡眠了10s,打印出来的线程ID也是一样的。



把上面 代码中的post去掉,以一个标准的方式启动一个thread,new一个thread,并调用start方法。


两个线程ID不一样,一执行,activity也立刻显示出来。


Bundle,有点像hash map,可以set,get,一个特殊类型的map,所有的键都是String,它的值是基本的数据类型,没有Object.一个数据存储的工具。

package mars.handler;

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 HandlerTest2 extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		//打印了当前线程的ID
		System.out.println("Activity-->" + Thread.currentThread().getId());
		//生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能,这个类由Android应用程序框架提供
		HandlerThread handlerThread = new HandlerThread("handler_thread");
		//在使用HandlerThread的getLooper()方法之前,必须先调用该类的start();
		handlerThread.start();
		MyHandler myHandler = new MyHandler(handlerThread.getLooper());
		Message msg = myHandler.obtainMessage();
		//将msg发送到目标对象,所谓的目标对象,就是生成该msg对象的handler对象
		Bundle b = new Bundle();
		b.putInt("age", 20);
		b.putString("name", "Jhon");
		msg.setData(b);
		msg.sendToTarget();
	}
	
	class MyHandler extends Handler{
		public MyHandler(){
			
		}
		public MyHandler(Looper looper){
			super(looper);
		}
		@Override
		public void handleMessage(Message msg) {
			Bundle b = msg.getData();
			int age = b.getInt("age");
			String name = b.getString("name");
			System.out.println("age is " + age + ", name is" + name);
			System.out.println("Handler--->" + Thread.currentThread().getId());
			System.out.println("handlerMessage");
		}
	}
}

执行结果


两者在不同的线程,数据的传递也没问题,实现了异步处理。






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值