且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Handler详解系列(九)——Handler常用方法示例

更新时间:2021-11-30 17:09:12

MainActivity如下:
package cc.c;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
/**
 * Demo描述: 
 * Handler常用方法
 * 1 sendMessage() 
 * 2 post() 
 * 3 postDelayed() 
 * 4 handleMessage()
 */
public class MainActivity extends Activity {
	private Runnable mRunnable;
	private Handler mHandler;
	private final int CANCEL_RUNNABLE = 99;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		initTest();
	}

	private void initTest() {
		System.out.println("UI线程ID=" + Thread.currentThread().getId());
		mHandler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
				if (msg.what == 1) {
					System.out.println("收到mHandler.sendMessage()方法发来的消息");
				}

				if (msg.what == CANCEL_RUNNABLE) {
					System.out.println("取消Runnable的执行");
					if (mRunnable != null) {
						removeCallbacks(mRunnable);
					}
				}
			}
		};

		// 为方便测试将以下三个方法分别调用
		// testSendMessage();
		// testPost();
		testPostDelayed();
	}

	/**
	 * Handler调用sendMessage()发送消息
	 */
	private void testSendMessage() {
		new Thread() {
			@Override
			public void run() {
				super.run();
				Message message = new Message();
				message.what = 1;
				message.obj = new Object();
				mHandler.sendMessage(message);
			}
		}.start();
	}

	/**
	 * Handler调用post()发送Runnable(本质也是发送消息)
	 */
	private void testPost() {
		mRunnable = new Runnable() {
			public void run() {
				System.out.println("Runnable所属线程ID="+Thread.currentThread().getId());
				for (int i = 0; i < 5; i++) {
					System.out.println("Runnable中的i=" + i);
				}
			}
		};
		mHandler.post(mRunnable);
	}

	/**
	 * Handler调用postDelayed()发送延迟的Runnable(本质也是发送消息)
	 */
	private void testPostDelayed() {
		mRunnable = new Runnable() {
			public void run() {
				System.out.println("Runnable所属线程ID="+Thread.currentThread().getId());
				for (int i = 10; i < 16; i++) {
					System.out.println("Runnable中的i=" + i);
				}
			}
		};
		// 1 发送带有延迟的Runnable
		mHandler.postDelayed(mRunnable, 1000);
		// 2 也可按照业务需求取消该mRunnable
		// 即调用removeCallbacks(mRunnable);
		// 等同于调用mHandler.sendEmptyMessage(CANCEL_RUNNABLE);
		mHandler.removeCallbacks(mRunnable);
	}

}

main.xml如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>