httpClient及android 原生接口实现下载并显示图片
16lz
2021-01-25
前言:这篇文章用到了Android的handler机制,对于handler机制我也还没搞得太清楚,只能先把相关的几个帖子贴上,大家先看看吧,等后面理解了再仔细讲讲,最后我另外给出了用android原生HttpURLConnection是怎样来下载并显示图片的,但这种方法一般不用,所以我也就不讲了,如果想看就看源码吧
上效果图:
配置AndroidManifest.xml
添加互联网访问权限
XML代码:
<?xml version="1.0" encoding="utf-8"?>
一、使用httpClient实现下载图片
android代码:
/** * @author harvic * @date 2013-12-27 * */package com.example.try_downloadimage_httpclient;import java.io.InputStream;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.view.View;import android.widget.Button;import android.widget.FrameLayout;import android.widget.ImageView;import android.widget.ProgressBar;public class MainActivity extends Activity {//服务器上的图片地址private static final String picURL="http://222.195.151.19/1.jpg";private Button btnFirst;private FrameLayout frameLayout;private Bitmap bitmap=null;private ProgressBar progress;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); btnFirst=(Button)this.findViewById(R.id.btnFirst); frameLayout=(FrameLayout)this.findViewById(R.id.frameLayout); progress=(ProgressBar)this.findViewById(R.id.progress); btnFirst.setOnClickListener(new Button.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubprogress.setVisibility(View.VISIBLE);//显示PrograssBar// 启动一个后台线程handler.post(new Runnable() {@Overridepublic void run() {DefaultHttpClient httpclient = new DefaultHttpClient();HttpGet httpget = new HttpGet(picURL);try {HttpResponse resp = httpclient.execute(httpget);//判断是否正确执行if (HttpStatus.SC_OK == resp.getStatusLine().getStatusCode()) {//将返回内容转换为bitmapHttpEntity entity = resp.getEntity();InputStream in = entity.getContent();bitmap = BitmapFactory.decodeStream(in);//向handler发送消息,执行显示图片操作Message msg = new Message();msg.what = 1;handler.sendMessage(msg);}} catch (Exception e) {e.printStackTrace();setTitle(e.getMessage());} finally {httpclient.getConnectionManager().shutdown();}}});}});}/** 这里重写handleMessage方法,接受到子线程数据后更新UI **/private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 1:// 关闭ImageView view = (ImageView) frameLayout.findViewById(R.id.image);view.setImageBitmap(bitmap);progress.setVisibility(View.INVISIBLE);//隐藏PrograssBarbreak;}}};}
注意:
1、这里用的是本地服务器,也就是我的电脑,所以你要把IP地址改成你自己的IP地址;
2、这里用到了handler机制,具体的我也还没弄清楚,分享两个网址:
http://linluan55.blog.163.com/blog/static/175542399201110153463382/
http://www.cnblogs.com/dawei/archive/2011/04/09/2010259.html
(源码见最底部)
二、使用android原生接口实现
效果图:
1、XML与上例相同
2、android代码
package com.example.try_asyncloadimage_1;/** * 完成下载图片功能 * */import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;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.view.View.OnClickListener;import android.widget.Button;import android.widget.FrameLayout;import android.widget.ImageView;import android.widget.ProgressBar;public class MainActivity extends Activity implements OnClickListener{private static final String picURL="http://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/Hukou_Waterfall.jpg/800px-Hukou_Waterfall.jpg";//private static final String picURL="http://222.195.151.19/1.jpg";private Button btnFirst;private ProgressBar progress;private FrameLayout frameLayout;private Bitmap bitmap=null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); btnFirst=(Button)this.findViewById(R.id.btnFirst); progress=(ProgressBar)this.findViewById(R.id.progress); progress.setVisibility(View.GONE); frameLayout=(FrameLayout)this.findViewById(R.id.frameLayout); btnFirst.setOnClickListener(this);}/** 这里重写handleMessage方法,接受到子线程数据后更新UI **/private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 1:// 关闭ImageView view = (ImageView) frameLayout.findViewById(R.id.image);view.setImageBitmap(bitmap);break;}}};// 前台ui线程在显示ProgressDialog,// 后台线程在下载数据,数据下载完毕,关闭进度框@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.btnFirst:// 启动一个后台线程handler.post(new Runnable() {@Overridepublic void run() {// 这里下载数据try {URL url = new URL(picURL);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setDoInput(true);conn.connect();InputStream inputStream = conn.getInputStream();bitmap = BitmapFactory.decodeStream(inputStream);Message msg = new Message();msg.what = 1;handler.sendMessage(msg);} catch (MalformedURLException e1) {e1.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});break;}}}
源码来啦,这两个例子的源码我都放在一起了,
源码地址:http://download.csdn.net/detail/harvic880925/6777015(不要分,仅供分享)
请大家尊重原创都版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/17609771
更多相关文章
- “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
- Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
- 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
- 使用 Android(安卓)自带的 proguard 混淆源码
- 详解Android(安卓)Activity之间跳转出现短暂黑屏的处理方法
- Android开发者确保应用程序运行的四大组件
- android中自定义ListView界面
- Android(安卓)SQLite学习
- Android(安卓)AsyncTask使用以及源码解析