Android中用URL模拟一个简单的图片加载器
首先,需要添加权限。
<uses-permission android:name="android.permission.INTERNET"/>
整体代码如下:
package com.tarena.viewer;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.Message; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast;/*** 网络图片查看器,需要添加Internet权限* @author chenchi**/ public class MainActivity extends Activity implements OnClickListener {Handler handler = new Handler(){//处理消息的时候我们需要区分这是成功的消息还是失败的消息//此方法在主线程中调用,可以用来刷新UIpublic void handleMessage(android.os.Message msg) {switch (msg.what) {case 1:ImageView imageView = (ImageView) findViewById(R.id.image_view);imageView.setImageBitmap((Bitmap) msg.obj);break;case 2:Toast.makeText(MainActivity.this, "加载失败", Toast.LENGTH_SHORT).show();break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn_download = (Button) findViewById(R.id.btn_download);btn_download.setOnClickListener(this);}@Overridepublic void onClick(View v) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {//下载图片//1.确定网址String path = "http://192.168.31.225:8088/user.png";try {//2.把网址封装成一个URL对象URL url = new URL(path);//3.获取客户端和服务器的连接对象,此时还没有建立连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();//4.对连接对象进行初始化//设置请求方法,注意大写conn.setRequestMethod("GET");//设置连接超时conn.setConnectTimeout(10000);//设置读取超时conn.setReadTimeout(10000);//5.发送请求,与服务器建立连接 conn.connect();//如果响应码为200,说明请求成功if(conn.getResponseCode() == 200){//获取服务器响应头中的流,流里的数据就是客户端啊请求的数据InputStream is = conn.getInputStream();//读取出流里面的数据,并构造成位图对象Bitmap bm = BitmapFactory.decodeStream(is);/** 这两行代码为什么注释,是因为运行也没有结果的* 因为只有主线程才能刷新UI操作,子线程是不可以的*/ // ImageView imageView = (ImageView) findViewById(R.id.image_view); // imageView.setImageBitmap(bm);//把消息返送到主线程的消息队列Message msg = new Message();//消息对象可以携带数据msg.obj = bm;msg.what = 1; //成功加载消息,返回1 handler.sendMessage(msg);}else{Message msg = handler.obtainMessage();//这样获取message是在池中获取,减少内存负荷msg.what = 2;//失败加载消息,返回0 handler.sendMessage(msg);}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}});thread.start();}}
还可以继续加上缓存的功能。
package com.tarena.viewer;import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL;import android.R.integer; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast;/*** 网络图片查看器,需要添加Internet权限* @author chenchi**/ public class MainActivity extends Activity implements OnClickListener {private String getFilesName(String path) {int index = path.lastIndexOf("/");return path.substring(index + 1);}Handler handler = new Handler(){//处理消息的时候我们需要区分这是成功的消息还是失败的消息//此方法在主线程中调用,可以用来刷新UIpublic void handleMessage(android.os.Message msg) {switch (msg.what) {case 1:ImageView imageView = (ImageView) findViewById(R.id.image_view);imageView.setImageBitmap((Bitmap) msg.obj);break;case 2:Toast.makeText(MainActivity.this, "加载失败", Toast.LENGTH_SHORT).show();break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn_download = (Button) findViewById(R.id.btn_download);btn_download.setOnClickListener(this);}@Overridepublic void onClick(View v) {//下载图片//1.确定网址final String path = "http://192.168.31.225:8088/user.png";//读取数据库返回的流里的数据,把数据写到本地文件,缓存起来final File file = new File(getCacheDir(), getFilesName(path));//判断,缓存中是否存在该文件if(file.exists()){//如果缓存存在,从缓存中读取数据System.out.println("从缓存读取的");Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());ImageView imageView = (ImageView) findViewById(R.id.image_view);imageView.setImageBitmap(bm);return;}System.out.println("从网络下载的");Thread thread = new Thread(new Runnable() {@Overridepublic void run() {try {//2.把网址封装成一个URL对象URL url = new URL(path);//3.获取客户端和服务器的连接对象,此时还没有建立连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();//4.对连接对象进行初始化//设置请求方法,注意大写conn.setRequestMethod("GET");//设置连接超时conn.setConnectTimeout(10000);//设置读取超时conn.setReadTimeout(10000);//5.发送请求,与服务器建立连接 conn.connect();//如果响应码为200,说明请求成功if(conn.getResponseCode() == 200){//获取服务器响应头中的流,流里的数据就是客户端啊请求的数据InputStream is = conn.getInputStream();byte[] b = new byte[1024];FileOutputStream fos = new FileOutputStream(file);int len = -1;while((len = is.read(b)) != -1){fos.write(b, 0, len);}//读取出流里面的数据,并构造成位图对象//Bitmap bm = BitmapFactory.decodeStream(is);Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());/** 这两行代码为什么注释,是因为运行也没有结果的* 因为只有主线程才能刷新UI操作,子线程是不可以的*/ // ImageView imageView = (ImageView) findViewById(R.id.image_view); // imageView.setImageBitmap(bm);//把消息返送到主线程的消息队列Message msg = new Message();//消息对象可以携带数据msg.obj = bm;msg.what = 1; //成功加载消息,返回1 handler.sendMessage(msg);}else{Message msg = handler.obtainMessage();//这样获取message是在池中获取,减少内存负荷msg.what = 2;//失败加载消息,返回0 handler.sendMessage(msg);}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}});thread.start();}}
转载于:https://www.cnblogs.com/DarrenChan/p/5462977.html
Android中用URL模拟一个简单的图片加载器相关推荐
- Android自定义简单的图片加载器(ImageLoader)
废话不多述,首先来说明下 为什么要用图片加载器 呢,就是为了避免图片重复从网络加载.也就是在第一次从网络加载之后就把图片缓存在本地,下次用的时候直接从本地查找,有的话就直接用,没有再从网络加载. 加载 ...
- Universal-Image-Loader解析(二)——DisplayImageOptions的详细配置与简单的图片加载...
在使用这个框架的时候,我们必须要配置一个DisplayImageOptions对象来作为ImageLoader.getInstance().displayImage()中的参数,所以很有必要讲解这个对 ...
- DisplayImageOptions的详细配置与简单的图片加载
在使用这个框架的时候,我们必须要配置一个DisplayImageOptions对象来作为ImageLoader.getInstance().displayImage()中的参数,所以很有必要讲解这个对 ...
- Android踩坑日记:使用Fesco图片加载库在GridView上的卡顿优化
1,fresco是一个强大的图片加载库 2,fresco设计了一个叫做image pipeline(图片管道)的模块,它负责从从网络,从本地文件系统,从本地资源加载图片,为了最大限度节约资源和cpu时 ...
- OkGo第三方框架的上传与下载+Glide图片加载器
OkGo第三方框架 OkGo依赖:implementation 'com.lzy.net:okgo:3.0.4' OkGo下载文件 OkGo.<File>get("http:// ...
- 一个方便的图片加载框架——ImageViewEx
我的博客:http://mrfufufu.github.io/ 一.前言 最近在整理项目中的一些代码,以备即将开展的新项目中使用,刚刚整理到一个图片加载的 lib,用起来非常的简单,和 picasso ...
- Playwright 模拟浏览器、模拟手机、忽略图片加载、等待、监听、操作事件
Playwright 是微软开源的自动化UI测试工具,支持Chrome.Firefox.Edge等多种浏览器,兼容多种语言.多种操作系统. 安装 pip install pytest-playwrig ...
- 一个简单的页面加载管理类(包含加载中,加载失败,数据为空,加载成功)
在最近公布的比赛框架中,发现了页面加载管理类,觉得挺有用的,所以做个简单的笔记. 什么是页面加载管理类呢?(大佬可直接跳过翻看实现过程) 如果能有这个问题,那么很好,哈哈哈,你和我一样,刚开始都挺疑惑 ...
- Android设计一个图片加载框架
本文不是具体编码去实现一个图片加载的框架,而是从理论上来讲解设计一个图片加载框架的注意事项和涉及的知识点,提供一个思路,或者帮助童鞋们应付面试.目前Android 发展至今优秀的图片加载框架太多,例如 ...
最新文章
- java求最小步数,使数组值相等的最小步数 Minimum Moves to Equal Array Elements
- 从理念到实践跳跃式演进!云的原生“免疫系统”如何有机作战?
- 微软360游戏机改服务器,战斗民族就是干高玩将Xbox 360改装成PC简直改装达人
- 自动化比手工测试成本高?使用Selenium评估测试自动化的ROI指标
- YUV序列下采样以及彩色4:2:0与灰度4:0:0转换---基于matlab实现
- 只保留日期_第五人格五个特定活动道具十分少见 最后一个一年只出现一次
- 通过波特率计算数据传输时间
- C# ajax上传图片
- 老路教你用得上的商学课_系列笔记
- arcgis发布服务后符号字体丢失解决办法
- 量产光伏离网并网逆变器设计资料(TMS320F28335) 这个是单项的 本装置DC-DC采用Boost升压,DCAC采用单相全桥逆变电路结构
- 电子信息工程考研方向计算机,电子信息工程考研方向
- pywifi安装的一个坑
- 教你如何注册到受限的MSN.COM、passport.com账号
- Typora一款让你无法拒绝的MarkDown编辑器
- 使用UltraISO从文件还原Linux操作系统ISO
- OceanBase 业务数据库实践(二)── DB2 迁移
- 二十四、从句_比较让步目的结果状语从句
- hiredis的各种windows版本
- 中科院计算所考博有感