标签:
1.Handler简介
handler是Android系统封装的用于线程更新UI,消息处理的机制。
[说明]
查看Android Framework源码可以看到,常见的Activity的生命周期onCreate(), onStart(), onResume(), onPause(), onStop(), onDestroy()都是通过handler发送不同Message,AMS(Activity Manager Service)通过Handler向ActivityThread发送消息,在ActivityThread中执行不同的Activity的周期。
2.Handler的用法
// Google文档的地址 http://developer.android.com/reference/android/os/Handler.html // Google对Handler的介绍 A Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue. Each Handler instance is associated with a single thread and that thread's message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it -- from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue.
[说明]
查看Google文档可以看出,Handler允许我们绑定(associate with)一个线程的MessageQueue,并通过该handler向该线程发送Message或者Runnable对象,一个Handler绑定了一个线程以及这个线程的MessageQueue,当你创建一个Handler的时候,该Handler就会和Thread以及该Thread的MessageQueue绑定。
首先,下面的程序,在子线程中更新UI:
public class MainActivity extends Activity
{
	TextView tv;
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tv = (TextView) findViewById(R.id.tv);
		new Thread()
		{
			public void run()
			{
				try
				{
					Thread.sleep(1000);
				} catch (InterruptedException e)
				{
					e.printStackTrace();
				}
				tv.setText("update UI");
			};
		}.start();
	}
}
[说明]
上面信息的主要内容是,不允许在子线程中更新UI线程,Android自身设定的机制则是只能在子线程中处理耗时的操作,处理完毕之后,在UIThread中更新UI,而子线程是不能更新UI的。
Handler主要提供了下面API来实现子线程与UIThread之间的通信问题:
public class MainActivity extends Activity
{
	@SuppressLint("HandlerLeak")
	Handler handler = new Handler()
	{
		public void handleMessage(android.os.Message msg)
		{
			if (msg.what == 0x1)
			{
				tv.setText("update UI");
			}
		};
	};
	TextView tv;
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tv = (TextView) findViewById(R.id.tv);
		new Thread()
		{
			public void run()
			{
				try
				{
					Thread.sleep(1000);
				} catch (InterruptedException e)
				{
					e.printStackTrace();
				}
				handler.sendEmptyMessage(0x1);
			};
		}.start();
	}
}
sendMessageDelayed(Message, long)是延迟long毫秒之后,再发送Message。public class MainActivity extends Activity
{
	@SuppressLint("HandlerLeak")
	Handler handler = new Handler()
	{
		public void handleMessage(android.os.Message msg)
		{
		};
	};
	TextView tv;
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tv = (TextView) findViewById(R.id.tv);
		new Thread()
		{
			public void run()
			{
				try
				{
					Thread.sleep(1000);
				} catch (InterruptedException e)
				{
					e.printStackTrace();
				}
				handler.post(new Runnable()
				{
					@Override
					public void run()
					{
						tv.setText("update UI");
					}
				});
			};
		}.start();
	}
}
public class MainActivity extends Activity
{
	Handler handler = new Handler();
	ImageView img;
	int[] images = // 存放循环播放的图片
	{ R.drawable.weather_0, R.drawable.weather_1, R.drawable.weather_2, R.drawable.weather_3, R.drawable.weather_4 };
	private int imgCount = images.length;
	private int index = 0;
	private long delayMillis = 1000L; // 每隔1s循环一次
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		img = (ImageView) findViewById(R.id.img);
		handler.post(imgRunnable);
	}
	private Runnable imgRunnable = new Runnable()
	{
		public void run()
		{
			img.setBackgroundResource(images[index % imgCount]);
			index++;
			handler.postDelayed(imgRunnable, delayMillis);
		}
	};
}<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" >
    <ImageView
        android:id="@+id/img"
        android:layout_width="200.0dip"
        android:layout_height="200.0dip"
        android:layout_centerInParent="true"
        android:contentDescription="@string/app_name" />
</RelativeLayout>handler.removeCallbacks(imgRunnable);
public class SecondActivity extends Activity
{
	@SuppressLint("HandlerLeak")
	Handler handler = new Handler(new Handler.Callback()
	{
		@Override
		public boolean handleMessage(Message msg)
		{
			if (msg.what == 0x1)
			{
				Log.v(LOG, "返回true,消息被截获");
				return true;
			} else if (msg.what == 0x2)
			{
				Log.v(LOG, "返回false,不截获");
				return false;
			}
			return false;
		}
	})
	{
		@Override
		public void handleMessage(Message msg)
		{
			Log.v(LOG, "收到消息....");
		}
	};
	Button btn1, btn2;
	private final String LOG = "SecondActivity";
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
		btn1 = (Button) findViewById(R.id.btn1);
		btn1.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				handler.sendEmptyMessage(0x1);
			}
		});
		btn2 = (Button) findViewById(R.id.btn2);
		btn2.setOnClickListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				handler.sendEmptyMessage(0x2);
			}
		});
	}
}标签:
原文地址:http://blog.csdn.net/tianmaxingkong_/article/details/51338418