Android 网络数据的缓存HttpResponseCache <18>

其实针对网络优化的内容还是非常非常多的,耗电,内存空间,图形渲染,图片压缩缓存等等太多了,这里根据专家的参考建议,做了一个


HttpResponseCache类的测试:

具体程序工程如下:

package org.durian.durianhttpresponsecache;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.http.HttpResponseCache;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class DurianMainActivity extends ActionBarActivity implements View.OnClickListener {

    private final static String TAG="DurianMainActivity";

    private Button mButton;
    private Button mReButton;
    private ImageView imageView;

    private HttpHandler mHttpHandler;
    private Bitmap bitmap;

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

        File httpCacheDir=new File(DurianMainActivity.this.getCacheDir(),"http");
        long httpCacheSize=10*1024*1024;
        try {
            HttpResponseCache.install(httpCacheDir,httpCacheSize);
        } catch (IOException e) {
            e.printStackTrace();
        }

        mButton=(Button)findViewById(R.id.button);
        mButton.setOnClickListener(this);

        mReButton=(Button)findViewById(R.id.reload);
        mReButton.setOnClickListener(this);

        imageView=(ImageView)findViewById(R.id.image);

        mHttpHandler=new HttpHandler(DurianMainActivity.this);

        bitmap=BitmapFactory.decodeResource(this.getResources(),R.mipmap.ic_launcher);


    }

    @Override
    protected void onStop() {
        super.onStop();

        HttpResponseCache cache=HttpResponseCache.getInstalled();
        if(cache!=null){
            cache.flush();
        }

    }

    private downInformationFromNet work=new downInformationFromNet();

    @Override
    public void onClick(View v) {

        int id=v.getId();
        switch (id){
            case R.id.button:
                work.execute();
                break;
            case R.id.reload:
                bitmap=BitmapFactory.decodeResource(this.getResources(),R.mipmap.ic_launcher);
                imageView.setImageBitmap(bitmap);
                break;
            default:
                break;
        }

    }

    private class HttpHandler extends Handler{

        private DurianMainActivity durian;
        public HttpHandler(Context context){
            durian=(DurianMainActivity)context;
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            durian.imageView.setImageBitmap(bitmap);

        }
    }

    private class downInformationFromNet extends AsyncTask<Integer,String,String>{

        @Override
        protected String doInBackground(Integer... params) {

            try {
                URL url=new URL("http://pic31.nipic.com/20130724/5252423_104848296000_2.jpg");

                try {

                    HttpURLConnection connection=(HttpURLConnection)url.openConnection();
                    connection.connect();

                    if(connection.getResponseCode()==HttpURLConnection.HTTP_OK){

                        InputStream is=connection.getInputStream();
                        bitmap= BitmapFactory.decodeStream(is);

                    }

                    connection.disconnect();

                } catch (IOException e) {
                    e.printStackTrace();
                }



            } catch (MalformedURLException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);

            mHttpHandler.sendEmptyMessage(0);

        }
    }


}


布局如下:

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context="org.durian.durianhttpresponsecache.DurianMainActivity">

    <Button
        android:id="@+id/button"
        android:text="button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/reload"
        android:text="reload"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

这里面需要4.0版本以上的.

测试效果:

<1> : 先把设备打开网络,点击第一个按钮,显示出图片;

<2> : 再关闭网络,在点击第二个按钮,然后再点击第一个按钮;

<3> : 图片继续显示了.

打开Android studio网络监察情况:

Android 网络数据的缓存HttpResponseCache <18>_第1张图片

然后关闭网络后:

Android 网络数据的缓存HttpResponseCache <18>_第2张图片

图片仍然显示.


保存了缓存:

Android 网络数据的缓存HttpResponseCache <18>_第3张图片


这样就可以缓解反复网络加载的情况了,节省耗电,同时快速加载了图片,体验效果得到优化.














你可能感兴趣的:(Android 网络数据的缓存HttpResponseCache <18>)