安卓多线程编程系列3:使用handler和message下载网络图片
使用handler和message进行网络操作是多线程编程经常使用的形式,下面我们来一起看一下它的使用方法。
整体思路:触发一个事件,在这个事件中开启一个线程,在这个线程中定义消息,在消息中携带数据,通过handler发送过去,在handler中的handleMessage中去处理消息,获取数据。具体而言,在xml文件中放置一个Button控件和一个ImageView控件,在activity中,定义一个MyThread类,继承Runnable这个类,重写里面的run方法,在这个方法中获取网络图片,并将网络图片对象赋值给message的obj,把定义的常量IS_FINISH赋值给message的what,发送message,定义一个Handler对象,在这个对象中重写handleMessage这个方法,在这个方法中获取到message中传递的信息,并将图片对象绑定到ImageView控件上,根据判断的what的值,来执行对话框的消失操作。注意在清单文件AndroidManifest.xml中添加网络授权。
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=".MainActivity" ><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:text="Button" /><ImageViewandroid:id="@+id/imageView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_centerHorizontal="true"android:src="@drawable/ic_launcher" /></RelativeLayout>
MainActivity.java文件:
package com.example.android_handler_message;
//使用handler和message下载图片并展示
import java.io.InputStream;import org.apache.http.HttpResponse;
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.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;public class MainActivity extends Activity {
//不能在UI主线程中直接访问网络private Button button;private ImageView imageView;private String image_path="http://pica.nipic.com/2007-11-09/200711912453162_2.jpg";private final int IS_FINISH=1;private ProgressDialog dialog=null;private Handler handler=new Handler(){@Overridepublic void handleMessage(android.os.Message msg) {
// 数据的接收byte[] data=(byte[])msg.obj;
// 对字节数组进行解码Bitmap bm=BitmapFactory.decodeByteArray(data, 0, data.length);imageView.setImageBitmap(bm);if(msg.what==IS_FINISH){dialog.dismiss();}};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button=(Button)findViewById(R.id.button1);imageView=(ImageView)findViewById(R.id.imageView1);
// 定义一个滚动条对话框dialog=new ProgressDialog(this);dialog.setTitle("提示");dialog.setMessage("正在下载,请稍后...");dialog.setCancelable(false);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubnew Thread(new MyThread()).start();dialog.show();}});}public class MyThread implements Runnable{@Overridepublic void run() {// TODO Auto-generated method stubHttpClient httpClient=new DefaultHttpClient();HttpGet httpGet=new HttpGet(image_path);HttpResponse httpResponse=null;
// 也可以用这种方式操作
// InputStream inputStream=null;try {httpResponse=httpClient.execute(httpGet);if(httpResponse.getStatusLine().getStatusCode()==200){
// 返回一个输入流
// inputStream=httpResponse.getEntity().getContent();byte[] data=EntityUtils.toByteArray(httpResponse.getEntity());
// 使用message携带数据
// 为什么不采用这种方式Message message=new Message();定义消息呢?
// 使用Message message=Message.obtain();可以减少内存空间,sPool这个对象为空的时候才构建对象
// 如果sPool这个对象不为空的话,可以从消息池中取出重复使用。Message message=Message.obtain();message.obj=data;message.what=IS_FINISH;
// handler发送messagehandler.sendMessage(message);}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}} @Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}
安卓多线程编程系列3:使用handler和message下载网络图片相关推荐
- Android系统开发之五:多线程编程详解(Handler ,Looper , Message , MessageQueue)
本期的多线程主题与Android相关,侧重讲解在Android中如何用好多线程,需要你有Java的多线程基础. 首先我们思考几个问题,在Android应用中为什么要用多线程?为了解决哪些问题?或者为了 ...
- C#多线程编程系列(五)- 使用任务并行库
目录 1.1 简介 1.2 创建任务 1.3 使用任务执行基本的操作 1.4 组合任务 1.5 将APM模式转换为任务 1.6 将EAP模式转换为任务 1.7 实现取消选项 1.8 处理任务中的异常 ...
- C#多线程编程系列(二)- 线程基础
目录 C#多线程编程系列(二)- 线程基础 1.1 简介 1.2 创建线程 1.3 暂停线程 1.4 线程等待 1.5 终止线程 1.6 检测线程状态 1.7 线程优先级 1.8 前台线程和后台线程 ...
- C#多线程编程系列(一)- 简介
目录 系列大纲 一.前言 二.目录结构 四.章节结构 五.相关链接 系列大纲# 目前只整理到第二章,线程同步,笔者后面会慢慢更新,争取能把这本书中精华的知识都分享出来. C#多线程编程系列(一)- 简 ...
- C#多线程编程系列(五)- 浅析C# Dictionary实现原理
目录 一.前言 二.理论知识 1.Hash算法 2.Hash桶算法 3.解决冲突算法 三.Dictionary实现 1. Entry结构体 2. 其它关键私有变量 3. Dictionary - Ad ...
- C#多线程编程系列(四)- 使用线程池
目录 1.1 简介 1.2 在线程池中调用委托 1.3 向线程池中放入异步操作 1.4 线程池与并行度 1.5 实现一个取消选项 1.6 在线程池中使用等待事件处理器及超时 1.7 使用计时器 1.8 ...
- Java多线程编程系列-实例变量和线程安全
导语 上面说到了多线程的简单实现,编写了几个入门的小例子,这里我们来研究一下关于实例变量和线程安全的问题.在自定义的线程类中的实例变量针对其他线程可以有共享和不共享之分,下多个线程之间进行交互的时 ...
- Java多线程编程系列-多线程基础
导语 如果想要深入的了解一个东西就需要不断的接近他,这样才能了解到其核心的东西.这个系列就来了解一下Java多线程.开始入坑吧! 在入坑之前先来看一个例子!! public class Tes ...
- C#多线程编程系列(五)- C# ConcurrentBag的实现原理
目录 一.前言 二.ConcurrentBag类 三. ConcurrentBag线程安全实现原理 1. ConcurrentBag的私有字段 2. 用于数据存储的ThreadLocalList类 3 ...
最新文章
- 发那科冲压直线搬运机器人_行业应用 | 直线七轴软件配置
- eclipse 收缩 选择行_阳台晾衣架不是只能装天花板上,学学日本,挂护栏上折叠收缩轻松...
- 10张逻辑思维图,迅速提升你的工作能力
- 计算结构体、数组、指针的sizeof
- easyui datagrid 中怎么选中所有页面的数据_学会这5个Excel中常用技巧,可以准时下班去摆摊了...
- hashmultimap java_【Java 学习笔记】 HashMultimap(guava)
- 使用tensorflow object detection API 训练自己的目标检测模型 (三)
- 第三百八十一节,Django+Xadmin打造上线标准的在线教育平台—xadmin全局配置
- matlab里面画离散信号怎么画_一、基本离散信号的MATLAB产生和图形实现
- 今天,帮技术圈伸张正义!
- 记录一枚验证URL的js正则表达式
- 改变你一生的五句话 (转)
- 计算机主板别称是什么城,上海别称什么城?
- 计算机设备显示黄色感叹号,电脑没声音,设备管理器中声音出现黄色感叹号怎么办?...
- 解决Linux(ubuntu),windows双系统重装后恢复开机选单
- 巴塞罗那,高迪的城市
- 【MATLAB教程案例15】基于WOA鲸鱼优化算法的函数极值计算matlab仿真及其他应用
- 缓存在日常生活中的体现
- 你需要了解的群体重测序都在这里(一)
- Docker删除指定镜像