2015-11-20 25 views
2

我使用排空從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(); 
 
      } 
 
     }

請幫助。 謝謝

+0

您是否意味着脫機時,您的應用程序仍可以從緩存中獲得響應?如果我正確理解你的想法,請去http://stackoverflow.com/questions/31897189/android-setup-volley-to-use-from-cache/32022946#32022946來檢查我的答案是否可以幫助(如果服務器不是支持緩存輸出)。如果服務器支持緩存,排針會自動緩存 – BNK

+0

嗨,是的,我的想法是這樣但不適用,我讀了你的文章,但我無法解決我的問題。 – navid

回答

0
//GLobal Functions 

public boolean isNetworkAvailable(Activity c) { 
     boolean state; 
     ConnectivityManager cmg = (ConnectivityManager) c 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetworkInfo = cmg.getActiveNetworkInfo(); 
     state = activeNetworkInfo != null && activeNetworkInfo.isConnected(); 

     if (state) { 
      return true; 
     } else { 
      //NO interntet 
      return false; 
     } 
    } 


    public JSONObject getVolleyCacheEntryByUrl(Activity c, 
      String relative_url) { 
     // RequestQueue queue = Volley.newRequestQueue(c); 
     String cachedResponse = new String(AppController 
       .getInstance() 
       .getRequestQueue() 
       .getCache() 
       .get(c.getResources().getString(R.string.base_url) 
         + relative_url).data); 

     try { 
      JSONObject cacheObj = new JSONObject(cachedResponse); 
      Log.e("CacheResult", cacheObj.toString()); 
      return cacheObj; 

     } catch (JSONException e) { 
      e.printStackTrace(); 
      return null; 
     } 

    } 



//MainActivity 

if(isNetworkAvailable(this)) { 
    loadDataFromServer(); 
} else { 
    loadDataFromCache(); 
} 



private void loadDataFromCache() { 

    String url = your-url.com/something; 
    if (MyFunctions.chechVolleyCacheByUrl(this, url) != null) { 
     try { 
      //Your function to parses the data 
      parseJson(getVolleyCacheEntryByUrl(
        this, url)); 
     } catch (NullPointerException e) { 
      //Handle exception 
     } 
    } 
} 

public void loadDattaFromServer() { 



    String url = your-url.com/something; 

    JsonObjectRequest obj = new JsonObjectRequest(
      Request.Method.GET, url, null, 
      new Response.Listener<JSONObject>() { 

       @Override 
       public void onResponse(JSONObject json) { 
        parseJson(json); 
       } 

      }, new Response.ErrorListener() { 

     @Override 
     public void onErrorResponse(VolleyError error) { 
      VolleyLog.d("volley", "Error: " + error.getMessage()); 

     } 
    }); 

    AppController.getInstance().addToRequestQueue(obj); 
    obj.setShouldCache(true); 

} 

上述代碼將幫助您解決您的問題。 注意:此代碼使用排球庫

+0

嗨,我試過但不能。 – navid

+0

你用這段代碼得到了什麼問題? – Arshad

+0

我改爲你的代碼在我的代碼之間,並替換這個但不工作。你可以編輯我的代碼? – navid