Handler 和 HandlerThread 的简单使用

HandlerThread类是一个线程专门处理Hanlder的消息,依次从Handler的队列中获取信息,逐个进行处理,保证安全,不会出现混乱引发的异常。HandlerThread继承于Thread,所以它本质就是个Thread。与普通Thread的差别就在于,它有个Looper成员变量。

关于 HandlerThread 在后面的文章中还有介绍。

Handler 还存在一些缺陷,它可能会照成内存溢出。所以可以把 Handler 放入 WeakReference (弱引用)中。

下面是利用 Handler 和 HandlerThread 下载图片:




MainActivity.java :

package com.crazy.handleryouhua;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.widget.ImageView;

public class MainActivity extends Activity {

	private ImageView imageView ;
	private MyHandler myHandler;
	private String str = "http://a3.att.hudong.com/82/83/300000879962127528838292312_950.jpg";
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		imageView = (ImageView) findViewById(R.id.imageView);

		HandlerThread handlerThread = new HandlerThread("handler_thread");
		// 在使用HandlerThread的getLooper()方法之前,必须先调用该类的start(),同时开启一个新线程;
		handlerThread.start();
		
		doSomething(str);
		
		// 将由HandlerThread获取的Looper传递给Handler对象,
		// 即由处于另外线程的Looper代替handler初始化时默认绑定的消息队列来处理消息。
		// HandlerThread 可以处理消息循环的线程,它是一个拥有Looper的线程,
		// 其实与其说Handler和一个线程绑定,倒不如说Handler和Looper是一一对应的。
		myHandler = new MyHandler(handlerThread.getLooper());

	}
	// 定义类
	class MyHandler extends Handler {
		public MyHandler() {

		}

		public MyHandler(Looper looper) {
			super(looper);
		}

		@Override
		public void handleMessage(Message msg) {
			if (msg.what == 0x123) {
				Bitmap bit = (Bitmap) msg.obj;
				imageView.setImageBitmap(bit);
			}
			
		}
	}

	private void doSomething(final String str) {

		new Thread(new Runnable() {
			@Override
			public void run() {
				Bitmap bt = connectionNet(str);
				Message msg = myHandler.obtainMessage();
				msg.what = 0x123;
				msg.obj = bt;
				// 将msg发送到myHandler
				msg.sendToTarget(); 
				
			}
		}).start();

	}

	private Bitmap connectionNet(String str) {
		URL url = null;
		HttpURLConnection conn = null;
		InputStream is = null;
		try {
			url = new URL(str);
			conn = (HttpURLConnection) url.openConnection();
			conn.connect();

			is = conn.getInputStream();
			Bitmap bmt = BitmapFactory.decodeStream(is);
			return bmt;
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (is != null) {
				try {
					is.close();
					conn.disconnect();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return null;
	}

}


activity_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="com.crazy.handleryouhua.MainActivity" >

    <ImageView 
        android:id="@+id/imageView"
        android:scaleType="fitXY"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>


注册访问权限:

<uses-permission android:name="android.permission.INTERNET"/>





阅读更多 登录后自动展开
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页