Android再学习-20141023-Intent-Thread

20141023-Android再学习

Intent对象的基本概念

  1. Intent是Android应用程序组件之一
  2. Intent对象在Android系统中表示一种意图
  3. Intent当中最重要的内容是action与data

Intent对象的基本使用方法

使用Intent在Activity之间传递数据的方法

  1. 在Activity之间可以通过Intent对象传递数据
  2. 使用putExtra()系列方法向Intent对象当中存储数据
  3. 使用getXXXExtra()系列方法从Intent对象当中取出数据

回顾Java当中的线程概念

  1. 线程的两种实现方式
    1. 继承Thread,代表线程
    2. 实现相关接口,代表线程体
  2. 线程的生命周期
  3. 多线程同步

MainThread(UI Thread)和Worker Thread

  • 所有与UI有关的代码写在MainThread当中。
  • 主线程不能阻塞,主线程一般不进行耗时较长的操作,比如联网下载,读取大文件等。

Android当中的线程使用

什么是Handler

Handler、Looper和MessageQueue的基本原理

Handler把消息对象添加到MessageQueue中,Looper负责从MessageQueue的头部不断取出消息对象,取出一个消息对象之后交给Handler处理。

public void onClick(View v){
	//当用户点击按钮是,创建一个消息对象,并使用Handler发送该消息对象
	Message msg = handler.obtainMessage();//获取Message对象
	msg.what = 2;//给Message属性赋值
	handler.sendMessage(msg);//把消息对象放到消息队列当中去
	//1. Looper将会从消息队列当中将消息对象取出,
	//2. Looper将会找到与消息对象对应的Handler对象(每一个消息对象都有一个对应的Handler对象)。
	//3. Looper将会调用消息对象的handleMessage(Message, msg)方法,用于处理该消息对象
}

通过Handler实现线程间的通信

在主线程当中实现Handler的handleMessage()方法

在Worker Thread当中通过Handler发送消息

public class MainActivity enxtends Activity {
	private Textview textview;
	private Button button;
	private Handler handler; //3. 定义一个变量
	@Override
	protected void conCreate(Bundle savedInstanceState) {
		super.onCreate(savedINstanceState);
		setContentView(R.layout.activity_main);

		textView = (TextView)findViewById(R.id.textViewId);
		button = (Button)findViewById(R.id.buttonId);

		handler = new Myhandler(); //4.使用Myhandler类生成对象

		button.setOnClickListener(new ButtonListener());//绑定监听器
	}

	class MyHandler extends Handler { 
		//1.首先定义一个handler的实现类,继承Handler
		@Override
		public void handleMessage(Message msg) {
			//2. 然后实现handleMessage方法

			System.out.println("handleMessage--->" + Thread.currentThread().getName()); // 测试说明:打印当前线程的名字

			String s= (String)msg.obj; // 8. 在主线程中将数值取出
			textView.setText(s); //在主线程中操作UI

		}
	}

	class ButtonListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			Thread t = new NetWorkThread();
			t.start();
		}
	}

	class NetworkThread extends Thread {
		//本线程为Worker Thread
		//@Override
		public void run(){

			System.out.println("network--->" + Thread.currentThread().getName()); // 测试说明:打印当前线程的名字

			//模拟访问网络,所以当线程运行时,首先休眠2秒
			try {
				Thread.sleep(2 * 1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			//变量s的值,模拟从网络中获取的数据
			String s = "网络中的数据";
			//textView.setText(s);//这样的操作是错误的,安卓系统中UI操作原则上只能在主线程中进行

			Message msg = handler.obtainMessage(); // 5.生成Message对象
			//sendMessage方法无论在主线程中发送还是在Worker Thread中发送都可以,这里在WorkerThread当中发送,然后在主线程将消息取出。
			msg.obj = s; // 6. 把s赋值给obj
			handler.sendMessage(msg); // 7. 调用sendMessage方法发送消息

		}
	}

}
原文地址:https://www.cnblogs.com/gcy77/p/4047851.html