24.带缓存的图片查看器
2017-01-18 00:36
162 查看
演示,如何缓存图片,同时第二次访问时从缓存中取出资源
步骤:1.访问网络资源,首先判断有没有缓存这个资源,如果有就直接从缓存中读取,如果没有缓存资源,则从网络路径path中读取
2.建立连接以后将资源缓存到本地,本例中是利用io保存在本地
3.最后刷新主线程UI
布局文件
activity_main.xml
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下载图片"
android:onClick="click"/>
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
逻辑代码
步骤:1.访问网络资源,首先判断有没有缓存这个资源,如果有就直接从缓存中读取,如果没有缓存资源,则从网络路径path中读取
2.建立连接以后将资源缓存到本地,本例中是利用io保存在本地
3.最后刷新主线程UI
布局文件
activity_main.xml
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下载图片"
android:onClick="click"/>
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
逻辑代码
public class MainActivity extends Activity { static ImageView iv; static MainActivity ma; static Handler handler = new Handler(){ //处理消息时,区分成功的消息和失败的消息 //此方法在主线程中调用,用来刷新UI public void handleMessage(android.os.Message msg){ switch (msg.what){ case 1: //把位图对象显示到ImageView iv.setImageBitmap( (Bitmap) msg.obj); break; case 0: Toast.makeText(ma, "请求失败", Toast.LENGTH_SHORT).show(); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv = (ImageView) findViewById(R.id.iv); ma = this; } public void click(View v){ final String path = "http://192.168.0.102:8080/p1.jpg"; final File file = new File(getCacheDir(),getFileName(path)); //判断是否缓存文件, if(file.exists()){ //如果缓存存在,从缓存读取图片 System.out.println("从缓存中读取图片"); Bitmap bt = BitmapFactory.decodeFile(file.getAbsolutePath()); iv.setImageBitmap(bt); }else{ //如果缓存不存在,从网络获取 System.out.println("从网络中读取图片"); Thread t= new Thread(){ @Override public void run(){ //1.确定地址 try { //2.把网址封装成一个url对象 URL url = new URL(path); //3.获取客户端和服务器的连接对象,此时还没建立连接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //4.对链接对象进行初始化 conn.setRequestMethod("GET"); //设置连接超时网络不好或者地址不对 conn.setConnectTimeout(5000); //设置读取超时客户端读取不到数据 conn.setReadTimeout(5000); //5发送请求与服务器建立连接 conn.connect(); //如果状态码是200请求成功 if(conn.getResponseCode() == 200){ //得到服务器响应头重的流,流中的数据就是客户端请求的额数据 InputStream is = conn.getInputStream(); //读取服务器返回的流里面你的数据,同时把数据写到本地的文件,缓存起来 FileOutputStream fos = new FileOutputStream(file); byte[] b = new byte[1024]; int len = 0; while((len = is.read(b)) != -1){ fos.write(b, 0, len); } fos.close(); //读取流里面的数据并构造成位图 //Bitmap bt = BitmapFactory.decodeStream(is); Bitmap bt = BitmapFactory.decodeFile(file.getAbsolutePath()); //新建一个消息加入消息队列 Message msg = new Message(); msg.obj = bt; msg.what = 1; //把消息发送到主线程的消息队列 handler.sendMessage(msg); }else{ //Toast.makeText(MainActivity.this, "请求失败", Toast.LENGTH_SHORT).show(); Message msg = handler.obtainMessage(); msg.what = 0; handler.sendMessage(msg); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; t.start(); } } //截取到文件的名字,+1是为了取消“/” public String getFileName(String path){ int index = path.lastIndexOf("/"); return path.substring(index + 1); } }
相关文章推荐
- 带缓存的网页图片查看器
- Android简易实战教程--第二十六话《网络图片查看器在本地缓存》
- Android简易实战教程--第二十六话《网络图片查看器在本地缓存》
- 带缓存功能的图片查看器
- 010_02带缓存的图片查看器
- 黑马Android:带缓存的网络图片查看器
- Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
- 基于jQuery的一个简单的图片查看器
- 三步搞定ANDROID应用图片缓存
- APICloud学习笔记之图片缓存
- Android 远程图片获取及本地缓存
- Android 四大大图片缓存(Imageloader,Picasso,Glide,Fresco)原理、特性对比
- android 随手记 图片缓存--DisplayImageOptions
- iOS:Documents目录下文件的操作(缓存图片为例)
- 使用.htaccess文件来启动图片缓存
- SDWebImage异步加载网络图片 缓存内存及本地
- IOS编程 图片缓存模块设计
- web本地客户端缓存图片实现
- 如何给图片做缓存