1、Default模式,也是沒有設置緩存模式時的預設模式 這個模式實現http協議中的內容,比如響應碼是304時,當然還會結合E-Tag和LastModify等頭。 StringRequest request = new StringRequest(url, method); request.set ...
- 1、
Default
模式,也是沒有設置緩存模式時的預設模式 這個模式實現http協議中的內容,比如響應碼是304時,當然還會結合E-Tag和LastModify等頭。
StringRequest request = new StringRequest(url, method);
request.setCacheMode(CacheMode.DEFAULT);
- 2、 當請求伺服器失敗的時候,讀取緩存 請求伺服器成功則返回伺服器數據,如果請求伺服器失敗,讀取緩存數據返回。
StringRequest request = new StringRequest(url, method);
request.setCacheMode(CacheMode.REQUEST_NETWORK_FAILED_READ_CACHE);
- 3、如果發現有緩存直接成功,沒有緩存才請求伺服器 ImageLoader的核心除了記憶體優化外,剩下一個就是發現把內地有圖片則直接使用,沒有則請求伺服器。
請求String
,緩存String
:
StringRequest request = new StringRequest(url, method);
// 非標準Http協議,改變緩存模式為IF_NONE_CACHE_REQUEST_NETWORK
request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST_NETWORK);
請求圖片,緩存圖片:
ImageRequest request = new ImageRequest(url, method);
request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST_NETWORK);
- 4、僅僅請求網路 無論如何也只會請求網路,也不支持http 304這種預設行為。
ImageRequest request = new ImageRequest(url, method);
request.setCacheMode(CacheMode.ONLY_REQUEST_NETWORK);
...
- 5、僅僅讀取緩存 無論如何僅僅讀取緩存,不會請求網路和其它操作。
Request<Bitmap> request = NoHttp.createImageRequest(imageUrl);
request.setCacheMode(CacheMode.ONLY_READ_CACHE);
註意:如果開發者想先得到緩存再請求網路,開發者可以先發起一個僅僅讀取緩存的Request
,然後發起一個僅僅請求網路的Request
,不過本人已經在準備NoHttp2.0了,到時候將會以一個全新的面貌和開發者們見面。
緩存模式支持緩存任何數據,因為NoHttp
保存數據是轉為byte[]
,讀取數據時是把byte[]
轉為開發者想要的數據,因此NoHttp
的緩存可以支持任何自定義的Request
。
伺服器端:
1 @WebServlet("/cache") 2 public class CacheServlet extends BaseJsonServlet { 3 private static final long serialVersionUID = 14646L; 4 5 public CacheServlet() { 6 super(); 7 } 8 9 @Override 10 protected String onResponse(HttpServletRequest request, HttpServletResponse response) throws Exception { 11 System.out.println("返回新的數據"); 12 return "NoHttp是最好用的Android網路框架。"; 13 } 14 15 /** 16 * 服務端本介面的數據是否過期,沒有過期則反悔相應頭304,如果過期,會重新返回數據 17 */ 18 @Override 19 protected long getLastModified(HttpServletRequest req) { 20 // 這裡主要是告訴http框架我們的數據是否被修改過,或者說是否過期 21 String path = getServletContext().getRealPath("index.html"); 22 return new File(path).lastModified(); 23 } 24 25 }
客戶端:
1 public class CacheActivity extends Activity implements View.OnClickListener { 2 3 /** 4 * 標誌請求是一般協議下的 5 */ 6 private final int nohttp_what_org = 0x01; 7 /** 8 * 標誌請求是請求失敗時讀取緩存 9 */ 10 private final int nohttp_what_failed_read_cache = 0x02; 11 /** 12 * 標誌請求是僅僅讀取緩存的 13 */ 14 private final int nohttp_what_only_read_cache = 0x03; 15 /** 16 * 測試緩存圖片 17 */ 18 private final int nohttp_what_only_read_cache_image = 0x04; 19 20 /** 21 * 顯示請求數據 22 */ 23 private TextView mTvResult; 24 /** 25 * 顯示請求圖片 26 */ 27 private ImageView mIvImage; 28 29 @Override 30 protected void onCreate(Bundle savedInstanceState) { 31 super.onCreate(savedInstanceState); 32 setContentView(R.layout.activity_cache); 33 findViewById(R.id.btn_request_org_cache).setOnClickListener(this); 34 findViewById(R.id.btn_request_failed_read_cache).setOnClickListener(this); 35 findViewById(R.id.btn_request_none_cache_request).setOnClickListener(this); 36 findViewById(R.id.btn_request_only_read_cache).setOnClickListener(this); 37 findViewById(R.id.btn_request_failed_read_cache_image).setOnClickListener(this); 38 mTvResult = (TextView) findViewById(R.id.tv_result); 39 mIvImage = (ImageView) findViewById(R.id.iv_image_cache); 40 } 41 42 @Override 43 public void onClick(View v) { 44 if (v.getId() == R.id.btn_request_org_cache) { 45 // 一般請求,走http標準協議 46 String url = "http://192.168.1.116/HttpServer/cache"; 47 Request<JSONObject> request = new FastJsonRequest(url); 48 // 因為NoHttp本身就是RESTFUL風格的標準Http協議,所以這裡不用設置或者設置為DEFAULT 49 request.setCacheMode(CacheMode.DEFAULT); 50 CallServer.getInstance().add(this, request, callBack, nohttp_what_org, true, false, true); 51 } else if (v.getId() == R.id.btn_request_failed_read_cache) { 52 // 請求失敗的時候返回緩存 53 String url = "http://192.168.1.116/HttpServer/cache"; 54 Request<JSONObject> request = new FastJsonRequest(url); 55 // 非Http的標準協議,需要設置為REQUEST_FAILED_READ_CACHE 56 request.setCacheMode(CacheMode.REQUEST_FAILED_READ_CACHE); 57 CallServer.getInstance().add(this, request, callBack, nohttp_what_failed_read_cache, true, false, true); 58 } else if (v.getId() == R.id.btn_request_none_cache_request) { 59 // 如果沒有緩存才去請求伺服器,否則使用緩存 60 String url = "http://192.168.1.116/HttpServer/cache"; 61 Request<JSONObject> request = new FastJsonRequest(url); 62 // 非Http的標準協議,需要設置為IF_NONE_CACHE_REQUEST 63 request.setCacheMode(CacheMode.IF_NONE_CACHE_REQUEST); 64 CallServer.getInstance().add(this, request, callBack, nohttp_what_only_read_cache, true, false, true); 65 } else if (v.getId() == R.id.btn_request_only_read_cache) { 66 // 僅僅請求緩存,不請求伺服器 67 String url = "http://192.168.1.116/HttpServer/cache"; 68 Request<JSONObject> request = new FastJsonRequest(url); 69 // 非Http的標準協議,需要設置為ONLY_READ_CACHE 70 request.setCacheMode(CacheMode.ONLY_READ_CACHE); 71 CallServer.getInstance().add(this, request, callBack, nohttp_what_only_read_cache, true, false, true); 72 } else if (v.getId() == R.id.btn_request_failed_read_cache_image) { 73 // 如果沒有緩存才去請求伺服器,否則使用緩存,緩存圖片演示,這一點非常適合封裝一個自己的Imageloader是來使用 74 Request<Bitmap> request = NoHttp.createImageRequest("http://image.tianjimedia.com/uploadImages/2013/214/CN267OUS22LM.jpg"); 75 request.setCacheMode(CacheMode.REQUEST_FAILED_READ_CACHE); 76 CallServer.getInstance().add(this, request, imageBack, nohttp_what_only_read_cache_image, true, false, true); 77 } 78 } 79 80 /** 81 * 結束圖片的請求結果 82 */ 83 private HttpCallBack<Bitmap> imageBack = new HttpCallBack<Bitmap>() { 84 @Override 85 public void onSucceed(int what, Response<Bitmap> response) { 86 mIvImage.setImageBitmap(response.get()); 87 mTvResult.setText("請求成功,是否來自緩存:" + response.isFromCache()); 88 } 89 90 @Override 91 public void onFailed(int what, String url, Object tag, Exception exception, int responseCode, long networkMillis) { 92 mIvImage.setImageResource(R.drawable.ic_launcher); 93 mTvResult.setText("請求失敗"); 94 } 95 }; 96 97 /** 98 * 處理JSONObject的請求結果 99 * 100 * @param what 是哪個請求 101 * @param response 請求對應的響應結果 102 */ 103 private void handlerResponse(int what, Response<JSONObject> response) { 104 String result = null; 105 if (what == nohttp_what_org) { 106 result = "一般請求,"; 107 } else if (what == nohttp_what_failed_read_cache) { 108 result = "請求失敗時返回緩存,"; 109 } else if (what == nohttp_what_only_read_cache) { 110 result = "僅僅請求緩存,"; 111 } 112 result += "請求是否來緩存" + response.isFromCache() + ";結果是:" + response.get().getString("data"); 113 mTvResult.setText(result); 114 } 115 116 /** 117 * 接受JSONObject的請求結果 118 */ 119 private HttpCallBack<JSONObject> callBack = new HttpCallBack<JSONObject>() { 120 121 @Override 122 public void onSucceed(int what, Response<JSONObject> response) { 123 handlerResponse(what, response); 124 } 125 126 @Override 127 public void onFailed(int what, String url, Object tag, Exception exception, int responseCode, long networkMillis) { 128 mTvResult.setText("請求失敗"); 129 } 130 }; 131 132 }