15-多线程编程(03-Handler和Message一)

UI和线程


1.UI与线程


1.1概述

    UI是英文User Interface单词的简称。

    当应用程序启动时,系统会为应用程序创建一个主线程(Main)或者叫UI线程,它负责分发事件到不同的控件(例如绘图事件)以完成应用程序与Android UI控件的交互。

    例如,触摸屏幕的一个按钮时,UI线程会把触摸事件分发到控件上,更改状态并加入事件队列,UI线程会分发请求和通知到各个控件,完成相应的动作。

    单线程模型的性能是非常差的,除非应用程序相当简单,特别是当所有的操作都在主线程中执行,比如访问网络或数据库之类的耗时操作将会导致用户界面锁定,所有的事件将不能分发,应用程序就像死了一样,更严重的是当超过5秒时,系统就会弹出“应用程序无响应(Application not response)”的对话框,称为ANR现象。


1.2 main线程

      主线程也叫UI线程,主线程负责UI的创建,UI的刷新以及处理用户的输入事件。

      提示:

               Android规定,Activity中的控件由主线程负责刷新,其它线程不能直接刷新。

               Android中执行耗时操作时应当放在自定义的线程中执行(自定义线程这里称为工作线程),主线程只从事调度(控制)和界面更新的工作。


2.Message对象

   2.1概述

        Message类用于存放消息中的数据,该类通常与Handler类配合使用。

   2.2常用属性

        1、int arg1:存放一个int类型的数据。

        2、int arg2:存放一个int类型的数据。

        3、int what:存放一个int类型的数据,该数据表示消息的类型,用来区分其他消息。

        4、Object obj:存放任意类型的对象。

  

    说明:资源池

     在Java中,创建和销毁对象是比较消耗资源的。如果在应用中需要频繁创建销毁某个类型的对象实例,这样会产生很多临时对象,当失去引用的临时对象较多时,虚拟机会进行垃圾回收(GC),CPU在进行GC时会导致应用程序的运行得不到响应,从而导致应用的响应性降低。

    资源池就是用来解决这个问题,当需要对象时,从资源池来获取,资源池负责维护对象的生命周期。

     Android的资源池中存放一定数量的同样类型的对象,当程序需要使用时,可以从资源池中获取,使用完成,收回资源池等待下一次被使用。

     示例:

      从资源池中获取Message对象。

     Message msg = Message.obtainMessage();

提示:若之前没有创建过Message,则创建给对象。Android系统会在适当的时候回收该对象,方便下次取用。



3.Handler类

 

3.1概述

  在Android中Handler类可用于在主线程和工作线程中收发消息,Handler对象通过在工作线程中发送消息,该消息发送至消息队列中,等待处理。

  在主线程中Handler从消息队列中接收消息,Handler根据消息中的信息决定如何更新主线程中UI



package net.csdn.leigo.handler;

import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.ImageView;

import com.example.android_handler_message.R;

public class MainActivity extends Activity {
	private static final String IMG_URL = "http://p1.qhimg.com/d/_onebox/search.png";
	private static final int MESSAGE_WHAT = 100;
	private ImageView mDownloadImg;
	private ProgressDialog mPd;
	private Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			if (msg.what == MESSAGE_WHAT) {
				byte[] data = (byte[]) msg.obj;
				Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
				mDownloadImg.setImageBitmap(bm);
				mPd.dismiss();
			}
		}

	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		mDownloadImg = (ImageView) findViewById(R.id.iv_download_img);
		mPd = new ProgressDialog(this);
		mPd.setTitle("提醒信息");
		mPd.setMessage("下载中,请稍侯...");
	}

	public void downloadImg(View v) {
		mPd.show();
		new Thread(new Runnable() {

			@Override
			public void run() {
				HttpClient httpClient = new DefaultHttpClient();
				HttpGet httpGet = new HttpGet(IMG_URL);
				try {
					HttpResponse httpResponse = httpClient.execute(httpGet);
					if (httpResponse.getStatusLine().getStatusCode() == 200) {
						HttpEntity httpEntity = httpResponse.getEntity();
						byte[] data = EntityUtils.toByteArray(httpEntity);
						Message msg = Message.obtain();
						msg.obj = data;
						msg.what = MESSAGE_WHAT;
						handler.sendMessage(msg);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}).start();

	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值