文档章节

运用Handler.post()方法进行数据更新跟用Message对比(18)

f
 flyqilong
发布于 2016/02/27 21:23
字数 586
阅读 54
收藏 0
//运用Handler.post()
public class SecondActivity extends Activity {
	private String url = "http://litchiapi.jstv.com/Attachs/Top/11949/e650e0201de541d2ba91dca202b0fcfe.jpg";
	private ImageView imageview;
	private Handler handler = new Handler();// 注意:这里用handler.post()方法,所以不用实现里面的方法

	// 这种方法是不用到Message(),只是利用handler.post(Runable)方法来更新,里面其实放的是代码,注意:存放的代码它属于主线程;
	// 注意:这里用handler.post()方法,所以不用实现里面的方法

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 这个SecondActivity要用主布局记得在功能清单文件改配置
		imageview = (ImageView) this.findViewById(R.id.imageview);
		// 子线程,下载操作
		new Thread(new Runnable() {

			@Override
			public void run() {
				Log.i("MainActivity", "first"
						+ Thread.currentThread().getName());
				byte[] data = loadImage(url);
				final Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
						data.length);
				handler.post(new Runnable() {
					// 注意:这里是主线程,只是一个代码,因为它没有启动所以不算线程
					@Override
					public void run() {
						Log.i("MainActivity", "second"
								+ Thread.currentThread().getName());
						imageview.setImageBitmap(bitmap);
					}
				});

			}
		}).start();
	}

	public byte[] loadImage(String url) {
		try {
			HttpClient client = new DefaultHttpClient();
			HttpGet get = new HttpGet(url);
			HttpResponse response = client.execute(get);
			if (response.getStatusLine().getStatusCode() == 200) {
				return EntityUtils.toByteArray(response.getEntity());
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
}

//使用handler.sendEmptyMessage()通知更新
//这是第一种方法:利用handler.sendEmptyMessage()通知更新
//另外一种方法是不用到Message(),只是利用handler.post(Runable)方法来更新,里面其实放的是代码,注意:存放的代码它属于主线程;

public class MainActivity extends Activity {
	private String url = "http://litchiapi.jstv.com/Attachs/Top/11949/e650e0201de541d2ba91dca202b0fcfe.jpg";
	private ImageView imageview;
	private ProgressDialog dialog;
	Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case 0:
				dialog.show();
				break;

			case 1:
				imageview.setImageBitmap((Bitmap) msg.obj);
				break;
			case 2:
				dialog.dismiss();
				break;
			}
		};
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		imageview = (ImageView) this.findViewById(R.id.imageview);
		dialog = new ProgressDialog(this);
		dialog.setTitle("提示");
		dialog.setIcon(R.drawable.ic_launcher);
		dialog.setMessage("正在下载数据!!!");
		new Thread(new Runnable() {

			@Override
			public void run() {
				// 1.显示对话框
				handler.sendEmptyMessage(0);// 通知主线程显示对话框
				// 2.下载数据
				byte[] data = loadImage(url);
				Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
						data.length);
				Message message = Message.obtain();
				message.what = 1;
				message.obj = bitmap;
				handler.sendMessage(message);// 发送主线程设置图片显示
				// 3.关闭对话框
				handler.sendEmptyMessage(2);
			}

		}).start();
	}

	public byte[] loadImage(String url) {
		try {
			HttpClient client = new DefaultHttpClient();
			HttpGet get = new HttpGet(url);
			HttpResponse response = client.execute(get);
			if (response.getStatusLine().getStatusCode() == 200) {
				return EntityUtils.toByteArray(response.getEntity());
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
}


© 著作权归作者所有

共有 人打赏支持
f
粉丝 3
博文 93
码字总数 53900
作品 0
Android工程师
私信 提问
Android开发——子线程操作UI的几种方法

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 在看方法之前需要了解一下Android中的消息机制。 转载请标明出处...

SEU_Calvin
2016/08/04
0
0
android 异步通信机制Handler的分析与运用

当我们应用程序启动时,Android系统就会创建一个主线程即UI线程,在这个UI线程中进行对UI控件的管理,如页面的刷新或者事件的响应等过程。同时Android规定在UI主线程不能进行耗时操作,否则会...

ostracod
06/29
0
0
详解Android中Handler的使用方法

在Android开发中,我们经常会遇到这样一种情况:在UI界面上进行某项操作后要执行一段很耗时的代码,比如我们在界面上点击了一个”下载“按钮,那么我们需要执行网络请求,这是一个耗时操作,...

我叫leo-
2016/04/27
88
0
杂文总结--2

实现线程:继承Thread类或者实现Runnable接口 由于Handler运行在主线程中(UI线程中), 它与子线程可以通过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sed...

ctozhong
2014/05/12
0
0
Android:用Handler实现异步处理功能

一.一个问题 有这样一个问题值得我们思考,若把一些类似于下载的功能(既耗时且不一定有结果)写在Activity(主线程)里,会导致Activity阻塞,长时间无响应,直至页面假死(如果5秒钟还没有完成...

z.net
2012/08/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java框架学习日志-7(静态代理和JDK代理)

静态代理 我们平时去餐厅吃饭,不是直接告诉厨师做什么菜的,而是先告诉服务员点什么菜,然后由服务员传到给厨师,相当于服务员是厨师的代理,我们通过代理让厨师炒菜,这就是代理模式。代理...

白话
今天
21
0
Flink Window

1.Flink窗口 Window Assigner分配器。 窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动的(Count Window,例如:每一百个元素)。 一种经典的窗口分类可以分成: 翻...

满小茂
今天
15
0
my.ini

1

architect刘源源
今天
14
0
docker dns

There is a opensource application that solves this issue, it's called DNS Proxy Server It's a DNS server that solves containers hostnames, if could not found a hostname that mat......

kut
今天
15
0
寻找数学的广度——《这才是数学》读书笔记2700字

寻找数学的广度——《这才是数学》读书笔记2700字: 文|程哲。数学学习方式之广:国内外数学教育方面的专家,进行了很多种不同的数学学习方式尝试,如数学绘本、数学游戏、数学实验、数学步道...

原创小博客
今天
26
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部