Android开发-下载网络图片并显示到本地
Android下载网络图片的流程是:
发送网络请求->将图片以流的形式下载下来->将流转换为Bitmap并赋给ImageView控件。
注意点
- 最新的Android系统不可以在主线程上请求网络,需要使用线程来请求
- 下载图片属于耗时任务,最优做法是放在一个AsyncTask中操作
设计思路
1.网络请求:该例中需要下载的文件类型是图片类型,可以将网络请求获取的数据类型转换为Bitmap已供ImageView直接使用,但是一个合理的网络请求类的设计是将下载的数据类型转换为最基本的InputStream,这样不管是下载图片,音频,文本还是视频,都可以将结果抛出去让上层的逻辑来处理。
2.异步请求:下载图片,网络下载属于耗时操作,所以需要封装一个AsyncTask来处理网络请求,该请求继承自Runnable接口。
3.异步回调:前台需要通过回调的方式来得到图片源,并将该图片源赋值给ImageView.
相关代码
NetService:网络请求服务类
public class NetService {
public static InputStream getInputStreamByUrl(String address){
URL url = null;
HttpURLConnection urlConnection = null;
try {
url = new URL(address);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setConnectTimeout(2 * 1000);
urlConnection.setRequestMethod("GET");
return urlConnection.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
NetServiceTask:AsyncTask类
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import java.io.BufferedInputStream;
import java.io.InputStream;
public class NetServiceTask extends AsyncTask<String, Void, Bitmap> implements Runnable{
private String address;
private URLPostHandler urlPostHandler = null;
public NetServiceTask(String address, URLPostHandler urlPostHandler) {
this.address=address;
this.urlPostHandler=urlPostHandler;
}
/**
* 表示任务执行之前的操作
*/
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}
/**
* 主要是完成耗时的操作
*/
@Override
protected Bitmap doInBackground(String... arg0) {
InputStream inputStream=NetService.getInputStreamByUrl(arg0[0]);
if(inputStream!=null){
return BitmapFactory.decodeStream(new BufferedInputStream(inputStream));
}
return null;
}
/**
* 主要是更新UI的操作
*/
@Override
protected void onPostExecute(Bitmap result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if(this.urlPostHandler!=null&&result!=null){
this.urlPostHandler.PostHandler(result);
}
}
@Override
public void run() {
execute(this.address);
}
}
URLPostHandler:回调接口
public interface URLPostHandler {
void PostHandler(Bitmap bitmap);
}
前台请求图片并显示到ImageView
public class MainActivity extends AppCompatActivity {
Button buttonDownload;
ImageView imageViewImg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonDownload = (Button) findViewById(R.id.buttonDownload);
imageViewImg = (ImageView) findViewById(R.id.imageViewImg);
buttonDownload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String address = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1490783056273&di=6160d101d31dcf5f44b443ad9c5b2648&imgtype=0&src=http%3A%2F%2Fimg.sc115.com%2Fuploads%2Fallimg%2F110626%2F2011062622383898.jpg";
NetServiceTask netServerTask= new NetServiceTask(address,new URLPostHandler() {
@Override
public void PostHandler(Bitmap bitmap) {
imageViewImg.setImageBitmap(bitmap);
}
});
Thread thread=new Thread(netServerTask);
thread.start();
}
});
}
}
最新文章
- hadoop 2.7.2 + zookeeper 高可用集群部署
- Docker--在Docker中运行应用
- Ubuntu1404安装gogs过程
- ResourceManager里面Trackingui需要手动该ip
- NPOI操作Excel导入DataTable中
- 20145304 刘钦令 Java程序设计第二周学习总结
- php大力力 [037节] Iconfont-阿里巴巴矢量图标库
- MFC实现Gif动画制作工具
- 【BZOJ】2463: [中山市选2009]谁能赢呢?(博弈论)
- ABAP基本数据类型、通用类型
- 核心概念 &mdash;&mdash; 服务提供者
- 理解Python的*args, **kwargs
- Codeforces Round #256 (Div. 2/B)/Codeforces448B_Suffix Structures(字符串处理)
- lisp构造表
- JAVA字符串比较equals()和equalsIgnoreCase()差异
- WordCount结对编程
- iOS学习——核心动画
- HNOI2006公路修建问题
- docx httpheader头设置
- Docker 搭建私有仓库
热门文章
- Android 官方博客 - Android应用程序的内存分析(翻译)(转)
- oracle 导出导入不含数据的空库
- Entity Framework底层操作封装V2版本号(3)
- A - BBQ Easy
- YTU 2438: 三人三鬼
- BZOJ_3998_[TJOI2015]弦论_后缀自动机
- ab压力测试-突破最大线程数
- Redis: Redis Desk Manager Setup
- 微信公众平台-文章-app:让创意变为现实,这30个小程序“凭什么”脱颖而出?
- [App Store Connect帮助]八、维护您的 App(4.1)监控顾客评论:评分与评论概述