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

今天主要用到的是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. UML Sequence sample: if-else

    if (balance >= amount) { ... } else { ... }

  2. python字典嵌套字典的情况下获取某个key的value

    最近在用python写接口的测试程序,期间用到解析字典获取某个key的value,由于多个接口返回的字典格式不是固定的并存在多层嵌套的情况.在字典的方法中也没有找到可直接达到目的的方法(也可能是我对字 ...

  3. 把解压缩版的tomcat6注册成服务并设置自启动

    操作步骤: 1.在“开始 ”→“运行 ”中输入cmd 命令,进入MS-DOS界面 2.cd 到tomcat的bin目录下       C:/> cd tomcat/bin 3.运行命令servi ...

  4. 使用yum安装应用程序时候,报错:[Errno 14] PYCURL ERROR 7 - "Failed to connect to 2001:da8:8000:6023::230: 网络不可达"

    使用yum安装应用程序时候,报错:[Errno 14] PYCURL ERROR 7 - "Failed to connect to 2001:da8:8000:6023::230: 网络不 ...

  5. Linux下安装JDK并配置环境变量

    1. 查询是否默认安装有JDK [root@localhost bin]# java -version java version "1.6.0_22" OpenJDK Runtim ...

  6. OC Runtime

    OC 是面向运行时的语言.Runtime就是系统在运行的时候的一些机制,其中最主要的是消息发送机制.OC语言与其他语言(如C语言)在函数(方法)的调用有很大的不同.C语言,函数的调用在编译的时候就已经 ...

  7. 仿google art图片预览算法及demo(iphone/安卓版本)

    演示地址:用手机扫描二维码(手机端浏览) 功能:双击放大,单指操作拖动,双指操作放大缩小.

  8. 5、SQL Server数据库、T-SQL

    SQL Server数据库基础 一.安装SQL Server数据库 setup.exe->安装->全新SQL Server独立安装或向现有安装添加功能->输入序列号->下一步- ...

  9. JPA merge(obj) 方法

    JPA中的merge类似Hibernate中的saveOrUpdate方法,当数据库中存在id=2的Person,在em.close()时会发送一条update语句,而当数据库中不存在id=2的Per ...

  10. RX(Reactive Extinsion)和IX(Interactive Extinsion)库改名了

    RX和IX库是我经常用到的库,今天写一个小程序的时候想用IX库的时候,发现却找不到了.在它的源码的网站上找了一下,发现它们被改名了,具体的变化为为: 对于RX库: Rx-Main -> Syst ...