网络图片加载,实现了简单的三级缓存

原创 2016年08月29日 20:35:37

这个Demo有网络加载图片和简单的三级缓存功能。


这是布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入图片的URL" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="查看"
        android:textSize="20sp" />

    <ImageView
        android:id="@+id/imageView"
        android:scaleType="fitCenter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>


Java代码

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

    private EditText editText;
    private ImageView imageView;
    private static final int SUCCEED = 215;
    private static final int ERROR = 392;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SUCCEED:
                    Bitmap bitmap = (Bitmap) msg.obj;
                    imageView.setImageBitmap(bitmap);
                    break;
                case ERROR:
                    Toast.makeText(MainActivity.this, "获取图片失败", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        editText = (EditText) findViewById(R.id.editText);
        imageView = (ImageView) findViewById(R.id.imageView);
    }

    public void onClick(View view) {

        //切换这里改变获得path的url
//        final String path = editText.getText().toString().trim();
        final String path = "http://img3.duitang.com/uploads/item/201409/15/20140915140123_WEH4N.png";

        final File file = new File(getCacheDir(), GetFileName(path));
        if (file.exists()) {
            Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
            Message obtain = Message.obtain();
            obtain.obj = bitmap;
            obtain.what = SUCCEED;
            handler.sendMessage(obtain);
        } else {
            if (TextUtils.isEmpty(path)) {
                Toast.makeText(this, "请输入图片的网址", Toast.LENGTH_SHORT).show();
                return;
            }
            new Thread() {
                @Override
                public void run() {
                    try {
                        URL url = new URL(path);
                        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                        //GET请求
                        httpURLConnection.setRequestMethod("GET");
                        //连接超时等待时间
                        httpURLConnection.setConnectTimeout(4000);
                        //网络读取超时时间
                        httpURLConnection.setReadTimeout(4000);

                        String contentType = httpURLConnection.getContentType();
                        Log.i("ContentType:", contentType);
                        int responseCode = httpURLConnection.getResponseCode();
                        if (responseCode == 200) {
                            InputStream inputStream = httpURLConnection.getInputStream();

                            byte[] bytes = new byte[1024];

                            int length;

                            FileOutputStream fileOutputStream = new FileOutputStream(file);

                            while ((length = inputStream.read(bytes)) != -1) {
                                fileOutputStream.write(bytes, 0, length);
                            }

                            fileOutputStream.close();

                            Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
                            //定义一个Message
                            Message message = Message.obtain();
                            //设置响应码
                            message.what = SUCCEED;
                            //设置object
                            message.obj = bitmap;
                            handler.sendMessage(message);
                            inputStream.close();
                        } else {
                            handler.sendEmptyMessage(ERROR);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
    }

    /**
     * http://img3.duitang.com/uploads/item/201409/15/20140915140123_WEH4N.png
     *
     * @return
     */
    private String GetFileName(String url) {
        int i = url.lastIndexOf("/");
        String substring = url.substring(i + 1);
        return substring;
    }

}


当然,还有个最重要的一步就是manifest中的权限

<uses-permissionandroid:name="android.permission.INTERNET"/>


通过 GET 请求将网络上的图片数据通过流缓存到本地内存中,再缓存到本地磁盘当中,通过判断是否存在数据来进行本地缓存的操作,测试的时候网址写死了,如果想测试其他图片可以 path 那一块切换一下,这里我没有做图片压缩的处理,如果加载像素过高的图片可能会出现 OOM 的错误。

当然网络加载图片和三级缓存还有许多种方式,这只是其中的一种而已,仅供学习,实际开发中还是根据需求不同做出调整。


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android网络图片加载三级缓存

一、概述网络图片的加载在Android的开发中是一个必不可少的功能,今天我们就来聊聊网络图片加载三级缓存策略。 所谓的三级缓存策略是指通过网络、本地、内存三级来缓存图片,减少不必要的网络交互,避免浪...

Android网络图片加载详解之"三级缓存"

三级缓存概览引入 我最近做的一个新闻类的项目中,用到了Picasso框架来加载网络图片. 优点是不但可以节约用户的使用流量,而且减少了内存的使用. Picasso是如何对图片进行维护的呢? 其实P...

爬坑小记---listview上图片加载实现三级缓存

LruCache(Least Recently Used)缓存的算法,即是近期最少使用算法,该算法的核心就是当缓存满的时候就会优先淘汰掉那些近期最少使用的缓存对象.

浅谈图片加载的三级缓存(一)

简单介绍了图片三级缓存原理 1、内存缓存 2、本地缓存 3、网络缓存

图片加载之三级缓存机制、AsyncTask优化、ComViewHolder极致优化ListView、LruCache搭配Runtime完美内存优化

给大家介绍一款比较完整的加载图片并且防止加载卡顿优化的代码,并且完美修复未加载出来图片滑动后在另一个页面加载跳动尴尬: 首先,我们来介绍一下加载图片的步骤: 1. 开启子线程去加载图片 2.获得byt...

Android网络图片加载缓存处理库的使用

课程概要 网络图片加载库的特点及优势 Universal-ImageLoader的用法和案例 Picasso的用法和案例 网络图片加载库的特点及优势Android中图片处理存在的难点: • OOM内...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)