先来说一下思路,先试用okhttp从网络获取到数据,然后使用SharedPreferences保存数据,然后使用gson解析数据结合picasso把文字和图片展示出来,很简单,下面来实现一下。
首先引入okhttp,在gradle中添加依赖
compile 'com.squareup.okhttp3:okhttp:3.5.0'
添加依赖后开始使用:
首先先定义一个网络请求工具类: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()
demo地址:https://github.com/guoliuya/SharedPreferencesCacheDemo.git