Handler的作用

直接上代码:

import java.util.Random;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
	
	private static final String TAG = "xxxxxxxxxxxxx";
	private Button btn1;
	private Button btn2;
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        setupViews();
    }
    
    private void setupViews() {
    	btn1 = (Button)findViewById(R.id.btn1);
    	btn2 = (Button)findViewById(R.id.btn2);
    	
    	btn1.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				fun1();
				fun2();
				fun3();
				//fun4();
				fun5();
			}
		});
    }
    
    // 打印顺序: before -- > run() -- > after
    private void fun1 () {
    	Log.i(TAG, "before Main Thread : " + Thread.currentThread().getName()); // main
    	new Runnable(){
    		public void run () {
    			Log.i(TAG, "run() thread: " + Thread.currentThread().getName()); // main
    		}
    	}.run(); // 只调用run()的话,会在主线程中执行,而且是串行化执行
    	try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
    	Log.i(TAG, "after Main Thread: " + Thread.currentThread().getName());
    }
    
    // 打印顺序: before -- > start() -- > after
    private void fun2 () {
    	Log.i(TAG, "before Main Thread : " + Thread.currentThread().getName());  // main
    	new Thread(new Runnable(){
    		public void run () {
    			Log.i(TAG, "start() thread: " + Thread.currentThread().getName()); // Thread-xx
    		}
    	}).start(); // 调用start()的话,会和主线程分开并发执行,另起一条线程执行
    	try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
    	Log.i(TAG, "after Main Thread: " + Thread.currentThread().getName());
    }
    
    // 打印顺序: before -- > after -- > Handler
    // 可以看出,handler是和UI线程分开异步执行的。这里可以使用handler去执行某项比较费时的操作,然后异步更新UI线程。这也是handler的主要作用之一。
    private void fun3() {
    	Log.i(TAG, "before Main Thread: " + Thread.currentThread().getName());  // main
    	Handler handler = new Handler();
    	handler.post(new Runnable(){
    		public void run () {
    			Log.i(TAG, "Handler thread: " + Thread.currentThread().getName()); // main
    		}
    	}); // 虽然也是在主线程中执行,当时会和主线程分开并发执行。实际上是把runnable对象放到队列中按照FIFO依次执行
    	try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
    	Log.i(TAG, "after Main Thread: " + Thread.currentThread().getName());
    }
    
    // 使用handler去循环执行某项任务
    private Handler handler;
	private Runnable task = new Runnable() {
		@Override
		public void run() {
			Log.i(TAG, "task thread: " + Thread.currentThread().getName()); // main
			if (handler != null) {
				handler.postDelayed(this, 1000L);  // 继续循环
			}
		}
	};
    private void fun4() {
    	handler = new Handler();
    	handler.postDelayed(task, 1000L);
    	
    	btn2.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				handler.removeCallbacks(task);
			}
		});
    }
    
    // 和HandlerThread配合使用,另起一条线程去执行队列中的Message
    private volatile HandlerThread handlerThread;
	private volatile Looper looper;
    private volatile MyHandler myHandler;
    // 自定义handler
    private class MyHandler extends Handler {
    	public MyHandler(Looper looper) {
    		super(looper);
    	}
    	
    	// 在这个方法里面去处理队列里面的一条条Message
    	@Override
        public void handleMessage(Message msg) {
    		Log.i(TAG, "customized handler thread: " + Thread.currentThread().getName()); // 和HandlerThread的名称相同
    		Log.i(TAG, msg.toString());
    	}
    }
    private void fun5() {
    	// 初始化工作
    	handlerThread = new HandlerThread("my_handler_thread");
    	handlerThread.start();
        looper = handlerThread.getLooper();
        myHandler = new MyHandler(looper);
        
        // 发送Message对象
        Message msg = myHandler.obtainMessage();
    	msg.what = 100; 
        msg.arg1 = new Random().nextInt();
        msg.obj = "obj value";
        //myHandler.sendMessageAtTime(msg, 1000L);
        myHandler.sendMessageDelayed(msg, 1000L);
        //myHandler.sendMessage(msg);
    }
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值