昨天我们学了如何连接网络,今天我们就学习一下如何从把网上图片显示到项目中

今天主要用到的是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显示图片及缓存图片的更多相关文章

  1. Android异步下载图片并且缓存图片到本地

    Android异步下载图片并且缓存图片到本地 在Android开发中我们经常有这样的需求,从服务器上下载xml或者JSON类型的数据,其中包括一些图片资源,本demo模拟了这个需求,从网络上加载XML ...

  2. Android中高效的显示图片之三——缓存图片

    加载一张图片到UI相对比较简单,如果一次要加载一组图片,就会变得麻烦很多.像ListView,GridView,ViewPager等控件,需要显示的图片和将要显示的图片数量可能会很大. 为了减少内存使 ...

  3. listview 使用图片三级缓存图片闪动

  4. TensorFlow与OpenCV,读取图片,进行简单操作并显示

    TensorFlow与OpenCV,读取图片,进行简单操作并显示 1 OpenCV读入图片,使用tf.Variable初始化为tensor,加载到tensorflow对图片进行转置操作,然后openc ...

  5. android Glide简单使用

    版权声明:大家可以转载,请写明转载申明 https://blog.csdn.net/bzlj2912009596/article/details/81702367 今天,简单讲讲Android里Gli ...

  6. Android 简单介绍图片压缩和图片内存缓存

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9316683 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工, ...

  7. android脚步---简单图片浏览器改变图像透明度

    图片浏览器调用ImageView的setAlpha方法来实现改变图片透明度. main.xml文件如下:三个按钮,两个imageview,,界面定义了两个ImageView,一个是显示局部图片的Ima ...

  8. Android中如何将Bitmap byte裸数据转换成Bitmap图片int数据

    Android中如何将Bitmap byte裸数据转换成Bitmap图片int数据 2014-06-11 10:45:14   阅读375次 我们在JNI中处理得到的BMP图片Raw数据,我们应该如何 ...

  9. 图解android开发在界面上显示图片

    图解android开发在界面上显示图片<申明:转自百度> <原文章地址:http://jingyan.baidu.com/article/49711c6153a277fa441b7c ...

随机推荐

  1. Liunx 常用命令

    Liunx 常用命令================================================================================ 1. 远程拷贝文件 ...

  2. oracle中having的用法

    having的用法,having一般是用在group的后面,用在前面查询结果相同,但是语法上不通顺.答:having是对行组进行过滤.一般是先用where 过滤返回行,用group by 对过滤后的行 ...

  3. oracle基础语法大全

    -----创建序列create sequence book_idINCREMENT BY 1 -- 每次加几个 START WITH 001 -- 从1开始计数 NOMAXVALUE -- 不设置最大 ...

  4. Tcp/IP

     在数据传输完毕之后,通信双方都可以发出释放连接的请求.释放连接的过程为如上图所示:      1)数据传输结束后,主机A的应用进程先向其TCP发出释放连接请求,不在发送数据.TCP通知对方要释放从A ...

  5. 这些年正Android - 大学

     还记得,第一次看见小周是在大一的操场上. 她正向教学楼站着,一身白配粉的休闲上衣搭配湖蓝色的牛仔裤,穿着一双很平凡的凉鞋,手里拿着当年的Nokia 3110c,皙清的手指,素颜的站着不言不笑.现在回 ...

  6. 使用dom4j解析XML

    jar包:dom4j //使用dom4j解析返回的xml SAXReader reader = new SAXReader(); Document doc = reader.read(new Byte ...

  7. 火币网api的nodejs实现

    var request = require('request'); var crypto = require('crypto'); var config = { api_url: 'https://a ...

  8. python面向对象编程

    面向对象编程,简称OOP, object oriented programming OOP编程的三大特性:封装,继承,多态 1. 封装 把功能的实现细节封装起来,不对外暴露.只留出入接口. 2. 继承 ...

  9. phthon

    没什么特别的,我们项目的跨平台代码都是在Windows环境下编码,然后跨平台编译调试,C++和Python代码都是如此.我们用C++实现底层和框架,用ctypes将纯C的API给Python化,然后用 ...

  10. es6 static

    static 定义的是类的方法只有类能调用,而普通方法是实例的方法只有类实例能调用.变量也一样. class A { static fn() { console.log('sss'); } fn2() ...