我使用排空從php和mysql數據庫接收本地服務器的數據。 我的問題是當用戶離線時如何使用緩存?如何在用戶離線時使用排空緩存
我CustomRequest是這樣的:
public class CustomRequest extends Request<JSONArray> {
private Listener<JSONArray> listener;
private Map<String, String> params;
public CustomRequest(int method, String url, Map<String, String> params,
Listener<JSONArray> reponseListener, ErrorListener errorListener) {
super(method, url, errorListener);
this.listener = reponseListener;
this.params = params;
}
protected Map<String, String> getParams()
throws com.android.volley.AuthFailureError {
return params;
}
@Override
protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONArray(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
@Override
protected void deliverResponse(JSONArray response) {
listener.onResponse(response);
}
}
和NetworkConnection是這樣的:
public class NetworkConnection {
private static NetworkConnection instance;
private Context mContext;
private RequestQueue mRequestQueue;
public NetworkConnection(Context c){
mContext = c;
mRequestQueue = getRequestQueue();
}
public static NetworkConnection getInstance(Context c){
if(instance == null){
instance = new NetworkConnection(c.getApplicationContext());
}
return(instance);
}
public RequestQueue getRequestQueue(){
if(mRequestQueue == null){
mRequestQueue = Volley.newRequestQueue(mContext);
}
return(mRequestQueue);
}
public <T> void addRequestQueue(Request<T> request){
getRequestQueue().add(request);
}
public void execute(final Transaction transaction, final String tag){
WrapObjToNetwork obj = transaction.doBefore();
Gson gson = new Gson();
if(obj == null){
return;
}
HashMap<String, String> params = new HashMap<>();
params.put("jsonObject", gson.toJson(obj));
CustomRequest request = new CustomRequest(Request.Method.POST,
"http://182:168:1:1:8282/new/package/ctrl/CtrlNew.php",
params,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
//Log.i("LOG", tag+" ---> "+response);
transaction.doAfter(response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("LOG", "onErrorResponse(): "+error.getMessage());
transaction.doAfter(null);
}
});
request.setTag(tag);
request.setRetryPolicy(new DefaultRetryPolicy(5000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
addRequestQueue(request);
}
}
這個代碼fargment
// NETWORK
@Override
public WrapObjToNetwork doBefore() {
mPbLoad.setVisibility((mSwipeRefreshLayout != null && mSwipeRefreshLayout.isRefreshing()) ? View.GONE : View.VISIBLE);
if(UtilTCM.verifyConnection(getActivity())){
Car car = new Car();
car.setCategory(0);
if(mList != null && mList.size() > 0){
car.setId(mSwipeRefreshLayout != null && mSwipeRefreshLayout.isRefreshing() ? mList.get(0).getId() : mList.get(mList.size() - 1).getId());
}
return(new WrapObjToNetwork(car, "get-cars", (mSwipeRefreshLayout != null && mSwipeRefreshLayout.isRefreshing())));
}
return null;
}
@Override
public void doAfter(JSONArray jsonArray) {
mPbLoad.setVisibility(View.GONE);
if(jsonArray != null){
CarAdapter adapter = (CarAdapter) mRecyclerView.getAdapter();
Gson gson = new Gson();
int auxPosition = 0, position;
if(mSwipeRefreshLayout != null && mSwipeRefreshLayout.isRefreshing()){
mSwipeRefreshLayout.setRefreshing(false);
auxPosition = 1;
}
try{
for(int i = 0, tamI = jsonArray.length(); i < tamI; i++){
Car car = gson.fromJson(jsonArray.getJSONObject(i).toString(), Car.class);
position = auxPosition == 0 ? mList.size() : 0;
adapter.addListItem(car, position);
if(auxPosition == 1){
mRecyclerView.getLayoutManager().smoothScrollToPosition(mRecyclerView, null, position);
}
}
if(jsonArray.length() == 0 && auxPosition == 0){
isLastItem = true;
}
}
catch(JSONException e){
Log.i(TAG, "doAfter(): "+e.getMessage());
}
}
else{
Toast.makeText(getActivity(), "Falhou. Tente novamente.", Toast.LENGTH_SHORT).show();
}
}
請幫助。 謝謝
您是否意味着脫機時,您的應用程序仍可以從緩存中獲得響應?如果我正確理解你的想法,請去http://stackoverflow.com/questions/31897189/android-setup-volley-to-use-from-cache/32022946#32022946來檢查我的答案是否可以幫助(如果服務器不是支持緩存輸出)。如果服務器支持緩存,排針會自動緩存 – BNK
嗨,是的,我的想法是這樣但不適用,我讀了你的文章,但我無法解決我的問題。 – navid