SharedPreferences+okhttp+gson+picasso实现简单的离线缓存

先来说一下思路,先试用okhttp从网络获取到数据,然后使用SharedPreferences保存数据,然后使用gson解析数据结合picasso把文字和图片展示出来,很简单,下面来实现一下。

首先引入okhttp,在gradle中添加依赖 

 添加依赖后开始使用:

       首先先定义一个网络请求工具类:OkHttpRequestHelper

package com.guoliuya.sharePreferencesCache;
 
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
 
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Handler;
 
import okhttp3.Cache;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Headers;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
 
public class OkHttpRequestHelper{
    private static final int MY_SOCKET_TIMEOUT_MS = 4000;
 
    private static final MediaType MEDIA_TYPE_JPG = MediaType.parse("image/jpeg");
    private static final String CACHE_FILE = FileUtil.CACHE_DOWNLOAD_DIR + File.separator + "cache.tmp";
 
    private Handler mHandler;
    private OkHttpClient mClient;
    private SharedPreferences mPref;
    private HttpCallBack mCallBack;
    private String info = "";
 
    public OkHttpRequestHelper(Context context,HttpCallBack callBack) {
        mPref = context.getApplicationContext().getSharedPreferences("http_cache",Context.MODE_PRIVATE);
        mHandler = new Handler(context.getMainLooper());
        mCallBack = callBack;
 
        int cacheSize = 10 * 1024 * 1024; // 10 MiB
        Cache cache = new Cache(new File(CACHE_FILE), cacheSize);
        Interceptor mNetworkInterceptor = new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request requestOrigin = chain.request();
                Headers headersOrigin = requestOrigin.headers();
                Headers headers = headersOrigin.newBuilder()
                        .set("Charset", "utf-8").build();
                Request request = requestOrigin.newBuilder().headers(headers).build();
                return chain.proceed(request);
            }
        };
        mClient = new OkHttpClient().newBuilder()
                .connectTimeout(MY_SOCKET_TIMEOUT_MS, TimeUnit.MILLISECONDS)
                .readTimeout(MY_SOCKET_TIMEOUT_MS, TimeUnit.MILLISECONDS)
                .writeTimeout(MY_SOCKET_TIMEOUT_MS, TimeUnit.MILLISECONDS)
                .retryOnConnectionFailure(true)
                .addNetworkInterceptor(mNetworkInterceptor)
                .cache(cache)
                .build();
    }
 
 
    public void getAsString(String url) {
 
        Request.Builder requestBuilder = new Request.Builder().url(url);
        requestBuilder.get();
 
        mClient.newCall(requestBuilder.build()).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mCallBack.onFailure(mPref.getString("main_page_cache",""));
 
                    }
                });
            }
 
            @Override
            public void onResponse(Call call, final Response response) {
                try {
                    info = response.body().string();
                } catch (IOException e) {
                    e.printStackTrace();
                }
 
                if (response.isSuccessful()) {
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            //使用SharedPreferences保存数据
                            SharedPreferences.Editor edit = mPref.edit();
                            edit.putString("main_page_cache",info);
                            edit.apply();
                            //缓存已经做好,接下来在无网的时候使用gson和picasso来展示出来
                            mCallBack.onSuccess(info);
 
                        }
                    });
                } else {
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            //onError
                        }
                    });
                }
 
            }
        });
    }
 
    public interface HttpCallBack{
        void onSuccess(String info);
        void onFailure(String info);
    }
}

接下来在主页面MainActivity使用gson和picasso在无网的情况下展示出来

package com.guoliuya.sharePreferencesCache;
 
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
 
import com.google.gson.Gson;
import com.squareup.picasso.Picasso;
 
public class MainActivity extends AppCompatActivity implements OkHttpRequestHelper.HttpCallBack {
    private OkHttpRequestHelper mOk;
    private String mUrl = "your url";//请求的url换成你自己的ur,我已经用正常的url测试过了,TestBean的内容换成你自己的
    private ImageView mIv;
    private TextView mTv;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mIv = (ImageView) findViewById(R.id.iv);
        mTv = (TextView) findViewById(R.id.tv);
        mOk = new OkHttpRequestHelper(this,this);
        loadData();
    }
 
    private void loadData() {
        mOk.getAsString(mUrl);
    }
 
    @Override
    public void onSuccess(String info) {
        TestBean testBean = new Gson().fromJson(info, TestBean.class);
        Picasso.with(this).load(testBean.getData().getNormalLiveList().get(0).getChannelImg()).into(mIv);
        mTv.setText(testBean.getData().getNormalLiveList().get(0).getTitle());
    }
 
    @Override
    public void onFailure(String info) {
        TestBean testBean = new Gson().fromJson(info, TestBean.class);
        Picasso.with(this).load(testBean.getData().getNormalLiveList().get(0).getChannelImg()).into(mIv);
        mTv.setText(testBean.getData().getNormalLiveList().get(0).getTitle());
    }
}

有网的时候会走回调onsuccess(),无网的时候会走回调onfailure()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值