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

今天主要用到的是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. EF4.1DbContext使用现成的数据库

    在配置文件中使用 <configuration> <connectionStrings> <add name="BlogDB" providerNam ...

  2. Tableau 地图无法识别怎么办

    Tableau地图是一个很优秀的工具,可以选择城市或者省份作为单位来显示地图. 前几天做了一个省份的感觉很好,今天用城市做单位居然有些城市识别不了,其中包括贵阳和宿迁.   换了拼音之后贵阳能够识别了 ...

  3. 这些年正Android - 身在他乡

    “从不敢想到想去做到,做到我想的,事实证明我并不像他们想象的那样脆弱.我只是需要一盏灯,一架钢琴,一支麦克风.曾经想象过做一名医生救死扶伤,也曾想过做律师,做记者,做奥运冠军,但是都没有结果.因为我最 ...

  4. jq封装的tab切换

    function tab(a,b,c){ $(a).on(c,function(){ $(this).addClass('active').siblings().removeClass('active ...

  5. php工作笔记4-mysql笔记1

    1.Mysql中数值的长度和最大值是没有关系的,它仅仅只代表了数据的宽度,比如:int(4)和int(8)可以存储的数据长度是一样的,她两的大小都是4Byte, 在存储上数据的时候比如Int(4) | ...

  6. 策略模式(strategy pattern)

    策略模式在java集合中的TreeSet和TreeMap中得到了很好的应用,我们可以实现Comparator接口实现Compareto()方法来定义自己的排序规则,然后通过TreeSet,TreeMa ...

  7. 移动端touch事件影响click事件以及在touchmove添加preventDefault导致页面无法滚动的解决方法

    这两天自己在写一个手机网页,用到了触屏滑动的特效,就是往右滑动的时候左侧隐藏的菜单从左边划出来. 做完之后在手机原生浏览器中运行正常,但在QQ和微信中打开,发现touchmove只会触发一次,而且to ...

  8. 修改tomcat应用日志默认编码格式

    前言 今天开发跟我说tomcat日志中的中文不能正常显示,根据以往的经验,我觉得可能跟服务器的编码有关,于是尝试各种方法,但还是没能解决问题. 后来我突然想到会不会跟tomcat的设置有关呢,于是在网 ...

  9. ORACLE 自治事物

    ORACLE 自治事物 一.问题 (1)现象   一个表A,存在一个触发器,该触发器用来统计表A的数量,并将结果更新到B表.此时,java代码里面调用insert into select 语句,会发生 ...

  10. git 忽视大小写

    git config core.ignorecase false http://stackoverflow.com/questions/3011625/git-mv-and-only-change-c ...