Handler和Bundle

1 Handler的简单使用

注意:handler对线程的处理post,并不是启动了一个新的线程,而是在当前线程调用run方法。

1.1 当触发startbtn的方法后,每隔3秒打印一次日志;当endbtn被点击后,才不再循环打印日志。

public class HandlerActivity extends Activity{

    private Button startbtn = null, endbtn = null;
    // 创建一个handler对象
    Handler handler = new Handler();
    // 将要执行的操作写在线程对象的run方法中
    Runnable updateThread = new Runnable() {
		
		@Override
		public void run() {
			System.out.println("UpdateThread");
			// 在此执行postDelayed或者post方法,循环工作
			handler.postDelayed(updateThread, 3000);
		}
	};
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        startbtn = (Button) findViewById(R.id.startbutton);
        endbtn = (Button) findViewById(R.id.endbutton);
        
        startbtn.setOnClickListener(new StartBtnListener());
        endbtn.setOnClickListener(new EndBtnListener());
    }
    class StartBtnListener implements OnClickListener {
		@Override
		public void onClick(View v) {
			// 调用handler的post方法,将要执行的线程对象添加到队列中
			handler.post(updateThread);
		}
    }
    class EndBtnListener implements OnClickListener {
		@Override
		public void onClick(View v) {
			handler.removeCallbacks(updateThread);	
		}
    }    
    
}

1.2 将Handler与Progressbar结合,不断更新进度条

理解线程队列和消息队列

public class HandlerActivity extends Activity{

	private ProgressBar bar = null;
    private Button startbtn = null;
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        startbtn = (Button) findViewById(R.id.startbutton);
        startbtn.setOnClickListener(new StartBtnListener());
        
        bar = (ProgressBar) findViewById(R.id.bar);
        
    }

    class StartBtnListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			bar.setVisibility(View.VISIBLE);
			updateBarHandler.post(updateThread);
		}
    	
    }
    
    Handler updateBarHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			bar.setProgress(msg.arg1);
			updateBarHandler.post(updateThread);
		}
    };
    
    // 线程类, 该类使用匿名内部类的方式进行声明
    Runnable updateThread = new Runnable() {
		int i = 0;
    	@Override
		public void run() {
			System.out.println("Begin Thread");
			i = i + 10;
			// 得到一个消息对象,Message类是由android操作系统提供
			Message msg = updateBarHandler.obtainMessage();
			msg.arg1 = i; // 使用arg1成员变量传递参数
			try {
				Thread.sleep(1000);
			} catch (Exception e) {
				e.printStackTrace();
			}
			// 将msg对象加入到消息队列当中
			updateBarHandler.sendMessage(msg);
			
			if(i==100) {
				System.out.println("thread end end end !");
				updateBarHandler.removeCallbacks(updateThread);
			}
		}
	};
    
}

2 通过HandlerThread和Handler实现新开线程处理msg,通过Bundle对象承载Msg的数据

通过HandlerThread获取Looper,交给Handler,从而实现Handler在新开线程中对msg的处理

public class HandlerActivity extends Activity{

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        setContentView(R.layout.main);
        
        System.out.println("acitivty--->"+Thread.currentThread().getId());
        System.out.println("activityName-->" + Thread.currentThread().getName());
        
        HandlerThread handlerthread = new HandlerThread("new_thread");
        handlerthread.start();
        
        MyHandler myhandler = new MyHandler(handlerthread.getLooper());
        Message msg = myhandler.obtainMessage();
        msg.obj = "abc";
        Bundle b = new Bundle();
        b.putInt("age", 20);
        b.putString("name", "jhon");
        msg.setData(b);
        msg.sendToTarget(); // 消息发送给目标对象,也就是调用obtainMessage方法的对象
//        myhandler.sendMessage(msg);
    }

    class MyHandler extends Handler {
    	public MyHandler() {
			
		}
    	public MyHandler(Looper looper) {
    		super(looper);
    	}
		@Override
		public void handleMessage(Message msg) { // 在新线程当中处理msg
			System.out.println("handler---->"+Thread.currentThread().getId());
    		System.out.println("handleMessage " + msg.obj + msg.getData().getString("name"));
		}
    	
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ADreamClusive

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值