先来说一下思路,先试用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