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

今天主要用到的是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. [转]jquery getJSON 数据联动(采用序列化和反序列化获取数据) .

    <html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">    ...

  2. WebStorm 10.0.4注册码

    WebStorm 是JetBrains旗下的一款轻量级JavaScript 开发工具,软件的功能非常强大,具备复杂客户端和服务器端的开发能力,被广大中国JS开发者誉为“Web前端开发神器”.“最强大的 ...

  3. Winmail.dat(TNEF) issue on outlook

    http://www.dwheeler.com/essays/microsoft-outlook-tnef.html

  4. DVD管理器集合版

    利用所学的集合写出的DVD管理系统,运用到了所学到集合基础. import java.text.ParseException; import java.text.SimpleDateFormat; i ...

  5. socket 网络编程

    1. 基础socket库 socket.h: /** * 网络套接字库 */ #ifndef Socket_h #define Socket_h #include <stdio.h> #i ...

  6. nvm

    nvm install stable #安装最新稳定版 node,现在是 5.0.0 nvm install 4.2.2 #安装 4.2.2 版本 nvm install 0.12.7 #安装 0.1 ...

  7. Xcode8支持iphone4s真机调试

    由于Apple公司升级不ios到10.0以上版本,因为硬件.性能等因素,不再支持iphone4,iphone4s,ipad1, ipad2,ipad3等老款设备.所以这些老款设备无法升级到ios10. ...

  8. Asynchronous javascript and xml

    关于Ajax,学习了原生的ajax和JQ的ajax,如今,它已是无处不在,首先,我们知道开发或者使用的软件分为c/s和b/s两种,分别是客户端/服务端和浏览器端/服务端. 前者的优点是响应速度快,但是 ...

  9. 解决linux 无法下载 oracle 官网 java的 安装包

    wget --no-cookies --no-check-certificate --header "Cookie: oraclelicense=accept-securebackup-co ...

  10. Geometry关系高级操作

    一些高级的操作 几何形状Geometry缓冲(buffer) 线段的融合(linemerge)是将Geometry A中相互连接的线段进行连接 多边形化操作(polygonize)对Geometry ...