編輯:關於android開發
git clone https://android.googlesource.com/platform/frameworks/volley把它編譯成jar文件就可以加入libs了 一、簡單的請求(以StringRequest為例) Http的通信最主要的部分應該就是發出請求和接收響應了,所以Volley的比較核心的一個類就是RequestQueue,一個請求隊列。它負責管理工作線程,讀寫緩存,和解析、分發響應(具體操作還是由具體的類實現),即將發出的Http請求都會首先聚集在這裡等待工作線程來實現請求。RequestQueue可以被看成一艘載滿Http請求的航空母艦,而工作線程就是彈射器喽。 所以按照航母起飛飛機的步驟,我們可以猜到利用Volley進行Http通信的簡單步驟: 1.獲取RequestQueue(得到一艘航母,可以是自己造的,也可以是委托別人造的,下面會提到) 2.實例化一個Request(得到一架飛機,你也知道飛機又很多類型啦) 3.將Request加入RequestQueue,等待工作線程將其發送出去(把飛機從機庫升上起飛甲板,等待彈射器把它扔出去) 起飛偵察機-發出GET請求 按照上面的步驟,第一步就是建立一個請求隊列,最簡單的方法就是用Volley.newRequestQueue(),這是一個特別方便的靜態方法,替我們默認實現了所有需要的東西(網絡、緩存等,這些在Volley中都有默認實現),它會返回一個已經開始運行的RequestQueue(相當於別人幫忙造了艘航母)。之後我們需要的只是設置好請求的響應監聽接口,把請求加入到這個隊列中就可以等著響應數據來敲門了。下面是Google文檔中的示例代碼:
1 //初始化一個請求隊列 2 RequestQueue queue = Volley.newRequestQueue(this); 3 String url ="http://www.google.com"; 4 5 //根據給定的URL新建一個請求 6 StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 7 new Response.Listener() { 8 @Override 9 public void onResponse(String response) { 10 //在這裡操作UI組件是安全的,因為響應返回時這個函數會被post到UI線程來執行 11 // 在這裡盡情蹂躏響應的String。 12 } 13 }, new Response.ErrorListener() { 14 @Override 15 public void onErrorResponse(VolleyError error) { 16 // 出錯了怎麼辦?涼拌!並且在這裡拌。 17 } 18 }); 19 // 把這個請求加入請求隊列 20 queue.add(stringRequest);
1 //初始化一個請求隊列 2 RequestQueue queue = Volley.newRequestQueue(this); 3 String url ="http://www.google.com"; 4 5 //根據給定的URL新建一個請求 6 StringRequest stringRequest = new StringRequest(Request.Method.POST, url, 7 new Response.Listener() { 8 @Override 9 public void onResponse(String response) { 10 // 在這裡處理請求得到的String類型的響應 11 } 12 }, new Response.ErrorListener() { 13 @Override 14 public void onErrorResponse(VolleyError error) { 15 // 在這裡進行出錯之後的處理 16 } 17 }) { 18 @Override 19 protected Map<String, String> getParams() throws AuthFailureError { 20 21 Map<String, String> map = new HashMap<String, String>(); 22 map.put("params1", "value1"); 23 map.put("params2", "value2"); 24 return map 25 }; 26 // 把這個請求加入請求隊列 27 queue.add(stringRequest);
1 ImageLoader imageLoader = new ImageLoader(mRequestQueue, new ImageCache() { 2 @Override 3 public void putBitmap(String url, Bitmap bitmap) { 4 } 5 6 @Override 7 public Bitmap getBitmap(String url) { 8 return null; 9 } 10 }); 11 12 //default_image是正在加載圖片時占位用的 13 //error_image是加載不成功時顯示的圖片 14 ImageListener listener = ImageLoader.getImageListener(imageView, R.drawable.default_image, R.drawable.error_image); 15imageLoader.get("your image url", listener);
1 networkImageView = (NetworkImageView) findViewById(R.id.network_image_view); 2 networkImageView.setDefaultImageResId(R.drawable.default_image); 3 networkImageView.setErrorImageResId(R.drawable.error_image); 4 networkImageView.setImageUrl("your image url", imageLoader);
三、Google推薦的用法 上面就是Volley的基本用法了,但是如果一個App需要頻繁的網絡通信的話,建立多個RequestQueue是件很奇怪的事兒(誰會因為臨時有飛機要在海上起飛就去新建一艘航母呢,這得多有錢啊),所以Google推薦我們只實例化一個RequestQueue來應付頻繁的Http通信,當然,要保證隊列的壽命和App一樣長。如何實現呢?Google又說了,不推薦在App的Application.onCretae()方法中實例化一個RequestQueue(不過確實是個簡單的方法哈),最好是建立一個單例模式的類,並把所有我們需要用到的Volley的瓶瓶罐罐都放進去,這樣顯得更模塊化。下面就是示例代碼。這段代碼中最重要的就是RequestQueue要用Application的Context實例化,要不然就會隨著Activity的生命周期不停重建。其實,像AsyncHttpClient中的純靜態使用方法也不錯(詳情見:http://loopj.com/android-async-http/) PS:下面還實現了一個簡單的ImageCache
1 private static MySingleton mInstance; 2 private RequestQueue mRequestQueue; 3 private ImageLoader mImageLoader; 4 private static Context mCtx; 5 6 private MySingleton(Context context) { 7 mCtx = context; 8 mRequestQueue = getRequestQueue(); 9 10 mImageLoader = new ImageLoader(mRequestQueue, 11 new ImageLoader.ImageCache() { 12 private final LruCache<String, Bitmap> 13 cache = new LruCache<String, Bitmap>(20); 14 15 @Override 16 public Bitmap getBitmap(String url) { 17 return cache.get(url); 18 } 19 20 @Override 21 public void putBitmap(String url, Bitmap bitmap) { 22 cache.put(url, bitmap); 23 } 24 }); 25 } 26 27 public static synchronized MySingleton getInstance(Context context) { 28 if (mInstance == null) { 29 mInstance = new MySingleton(context); 30 } 31 return mInstance; 32 } 33 34 public RequestQueue getRequestQueue() { 35 if (mRequestQueue == null) { 36 // getApplicationContext()是關鍵, 它會避免 37 // Activity或者BroadcastReceiver帶來的缺點. 38 mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext()); 39 } 40 return mRequestQueue; 41 } 42 43 public <T> void addToRequestQueue(Request<T> req) { 44 getRequestQueue().add(req); 45 } 46 47 public ImageLoader getImageLoader() { 48 return mImageLoader; 49 } 50 }
四、Volley是怎麼管理請求的呢? RequestQueue會維護一個緩存調度線程(cache線程)和一個網絡調度線程池(net線程)(注意,這是一池子線程),當一個Request被加到隊列中的時候,cache線程會把這個請求進行篩選:如果這個請求的內容可以在緩存中找到,cache線程會親自解析相應內容,並分發到主線程(UI)。如果緩存中沒有,這個request就會被加入到另一個NetworkQueue,所有真正准備進行網絡通信的request都在這裡,第一個可用的net線程會從NetworkQueue中拿出一個request扔向服務器。當響應數據到的時候,這個net線程會解析原始響應數據,寫入緩存,並把解析後的結果返回給主線程。如下圖:
Android學習第五篇——動畫效果 接下來我要介紹的是Android的一些動畫效果 一、AlphaAnimation透明動畫 這裡我用到了兩種不同的方法來實現透明動畫效
Android Activity的生命周期簡單總結 Android Activity的生命周期簡單總結 這裡的內容參考官方的文檔,這篇文章的目的不是去總結Activity
Android 手機衛士10--應用管理器,android10-- 1.添加不同類型條目 1 class MyAdapter extends BaseAdapter{
Exampleapp窗口大小調節,exampleapp窗口調節 結構圖: 基類: package ch.halcyon.squareprogressbar.exampl