Android之简单了解Bitmap显示图片及缓存图片
昨天我们学了如何连接网络,今天我们就学习一下如何从把网上图片显示到项目中
今天主要用到的是Bitmap 类
Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件
具体作用属性参考官方API: https://msdn.microsoft.com/zh-cn/library/system.drawing.bitmap(v=vs.110).aspx
不多说,看案例吧
做一个图片显示器:
activity_main.xml
<LinearLayout 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:orientation="vertical"
tools:context="com.example.imagelook.MainActivity" > <EditText
android:id="@+id/et_path"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/editText" >
</EditText> <Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="click"
android:text="@string/btn" /> <ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/> </LinearLayout>
mainAcitivity.java
package com.example.imagelook; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
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.util.Base64;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView; public class MainActivity extends Activity { private EditText et_path;
private ImageView iv; private Handler handler = new Handler(){
//处理消息
public void handleMessage(Message msg) { Bitmap bitmap = (Bitmap) msg.obj;
iv.setImageBitmap(bitmap);
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //1、找控件
et_path = (EditText) findViewById(R.id.et_path);
iv = (ImageView) findViewById(R.id.iv); } //2、点击按钮进行查看指定路径的源码
public void click(View v) throws IOException { new Thread(){
public void run(){
try {
//2.1、获取访问图片的路径
String path = et_path.getText().toString().trim(); File file = new File(getCacheDir(),Base64.encodeToString(path.getBytes(), Base64.DEFAULT));//test.png
if( file.exists() && file.length()>0 ) {
//使用缓存的图片
System.out.println("使用缓存图片");
Bitmap cacheBitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
//把cacheBitmap显示到iv上
Message msg = Message.obtain();
msg.obj = cacheBitmap ;
handler.sendMessage(msg); }else{
//第一次访问 联网缓存图片
System.out.println("第一次访问连接网络"); //2.2 创建URL对象
URL url = new URL(path); //2.3 获取httpURLConnection
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //2.4 设置请求方式
conn.setRequestMethod("GET"); //2.5设置超时时间
conn.setConnectTimeout(5000); //2.6获取服务器状态码
int code = conn.getResponseCode();
if (code == 200){
//2.7 获取图片数据 不管是什么数据(text 图片)都是以流行式返回
InputStream in = conn.getInputStream(); //2.7缓存图片 谷歌提供一个缓存目录
FileOutputStream fos = new FileOutputStream(file);
int len = -1 ;
byte[] buffer = new byte[1024];//1kb
while((len = in.read(buffer)) != -1){
fos.write(buffer,0,len);
}
fos.close();
in.close(); //2.8 通过位图工厂获取bitmap
//Bitmap bitmap = BitmapFactory.decodeStream(in);
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());//读取缓存 //2.9 把bitmap 显示到iv上
Message msg = Message.obtain();//消息池有消息池拿数据,没有new一个
msg.obj = bitmap ;
handler.sendMessage(msg);//发消息 } }
} catch (Exception e) {
e.printStackTrace();
}
};
}.start(); } }

配置好就可以运行看下效果了

下面说一下,案例的小细节吧!
因为图片如果每次加载,每次都要从网上读取数据流,显示到手机上面,这样很容易浪费客户流量,所以第一访问时可以下载图片,以后访问直接访问内存里的就好了。
1、判断客户是否是第一次访问
2、多线程访问网络


第一次访问,创建cache文件夹并保存文件

打印日志

再次访问,从文件中取出

我们可以在手机中清除缓存
例如海马玩模拟器:设置—>应用—>照片查看器—>清除缓存

如果我们不给图片起名字,像这样

下面是生成的文件名

所以我们手机经常会莫名其妙的出现一些我们看不懂得文件,
其实只是做了这一个小小的动作,让用户不敢随便删除我们的文件
Android之简单了解Bitmap显示图片及缓存图片的更多相关文章
- Android异步下载图片并且缓存图片到本地
Android异步下载图片并且缓存图片到本地 在Android开发中我们经常有这样的需求,从服务器上下载xml或者JSON类型的数据,其中包括一些图片资源,本demo模拟了这个需求,从网络上加载XML ...
- Android中高效的显示图片之三——缓存图片
加载一张图片到UI相对比较简单,如果一次要加载一组图片,就会变得麻烦很多.像ListView,GridView,ViewPager等控件,需要显示的图片和将要显示的图片数量可能会很大. 为了减少内存使 ...
- listview 使用图片三级缓存图片闪动
- TensorFlow与OpenCV,读取图片,进行简单操作并显示
TensorFlow与OpenCV,读取图片,进行简单操作并显示 1 OpenCV读入图片,使用tf.Variable初始化为tensor,加载到tensorflow对图片进行转置操作,然后openc ...
- android Glide简单使用
版权声明:大家可以转载,请写明转载申明 https://blog.csdn.net/bzlj2912009596/article/details/81702367 今天,简单讲讲Android里Gli ...
- Android 简单介绍图片压缩和图片内存缓存
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9316683 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工, ...
- android脚步---简单图片浏览器改变图像透明度
图片浏览器调用ImageView的setAlpha方法来实现改变图片透明度. main.xml文件如下:三个按钮,两个imageview,,界面定义了两个ImageView,一个是显示局部图片的Ima ...
- Android中如何将Bitmap byte裸数据转换成Bitmap图片int数据
Android中如何将Bitmap byte裸数据转换成Bitmap图片int数据 2014-06-11 10:45:14 阅读375次 我们在JNI中处理得到的BMP图片Raw数据,我们应该如何 ...
- 图解android开发在界面上显示图片
图解android开发在界面上显示图片<申明:转自百度> <原文章地址:http://jingyan.baidu.com/article/49711c6153a277fa441b7c ...
随机推荐
- eclipse 引用项目(转)
1. 项目右键 -->Properties 2. Java Build Path a) Projects --> Add b) Required Project Selection - ...
- Flex数据交互之Remoting
一 前言 Flex数据交互常用的有三种方式:WebService.HttpService以及Remoting. WebService方式已在这篇文章中给出,这篇文章主要讲解以Remoting方式进行数 ...
- Javascript中判断变量是 array还是object(是数组还是对象)
段文字是从github上截取由本人翻译过来的. 原文地址:https://github.com/nathansmith/javascript-quiz/blob/master/ANSWERS.md 怎 ...
- 2015.05.12:json的常用处理方式
1:json的介绍:json常用于前台与后台的数据传输 传递时需将json对象转换为json字符 JSON.stringify(); 2:json格式的查看应用:JsonView 3:后台获取到js ...
- 正确理解ThreadLocal
想必很多朋友对 ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLocal的理 解,然后根据ThreadLocal类的 ...
- Android IOS WebRTC 音视频开发总结(八十三)-- 使用WebRTC广播网络摄像头视频(上)
本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...
- 内容生成器:content、计数器、多列
一,内容生成器:content 补充before和after伪类选择器: 1):将内容添加到某个选择器定义的单个或者多个元素的每一个实例之前或者之后 2)与before选择器配合使用(同理大家想下会不 ...
- Linux内核分析总结
张潇月 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 学习目录: (1)计算机是如何工作的 h ...
- iframe跨域cookie问题
今天在项目里面遇到了iframe跨域不能写cookie的问题.应用场景是这样的:有A和B两个业务,A要通过iframe的方式嵌入B,但是在ie下A不能通过写cookie的方式记录信息,在firefox ...
- Python发送邮件(支持中文)
# -*- coding: utf-8 -*- from email.header import Header from email.mime.text import MIMEText import ...