編輯:關於Android編程
Android Volley 是Google開發的一個網絡lib,可以讓你更加簡單並且快速的訪問網絡數據。Volley庫的網絡請求都是異步的,你不必擔心異步處理問題。
Volley的優點:
下載和編譯volley.jar
需要安裝git,ant,android sdk
clone代碼:
git clone https://android.googlesource.com/platform/frameworks/volley
編譯jar:
android update project -p . ant jar
添加volley.jar到你的項目中
不過已經有人將volley的代碼放到github上了:
https://github.com/mcxiaoke/android-volley,你可以使用更加簡單的方式來使用volley:
Maven
format: jar
<dependency> <groupId>com.mcxiaoke.volley</groupId> <artifactId>library</artifactId> <version>1.0.6</version> </dependency>
Gradle
format: jar
compile 'com.mcxiaoke.volley:library:1.0.6'
Volley工作原理圖
創建Volley 單例
使用volley時,必須要創建一個請求隊列RequestQueue,使用請求隊列的最佳方式就是將它做成一個單例,整個app使用這麼一個請求隊列。
public class AppController extends Application { public static final String TAG = AppController.class .getSimpleName(); private RequestQueue mRequestQueue; private ImageLoader mImageLoader; private static AppController mInstance; @Override public void onCreate() { super.onCreate(); mInstance = this; } public static synchronized AppController getInstance() { return mInstance; } public RequestQueue getRequestQueue() { if (mRequestQueue == null) { mRequestQueue = Volley.newRequestQueue(getApplicationContext()); } return mRequestQueue; } public ImageLoader getImageLoader() { getRequestQueue(); if (mImageLoader == null) { mImageLoader = new ImageLoader(this.mRequestQueue, new LruBitmapCache()); } return this.mImageLoader; } public <T> void addToRequestQueue(Request<T> req, String tag) { // set the default tag if tag is empty req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); getRequestQueue().add(req); } public <T> void addToRequestQueue(Request<T> req) { req.setTag(TAG); getRequestQueue().add(req); } public void cancelPendingRequests(Object tag) { if (mRequestQueue != null) { mRequestQueue.cancelAll(tag); } } }
另外,你還需要一個Cache來存放請求的圖片:
public class LruBitmapCache extends LruCache<String, Bitmap> implement ImageCache { public static int getDefaultLruCacheSize() { final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); final int cacheSize = maxMemory / 8; return cacheSize; } public LruBitmapCache() { this(getDefaultLruCacheSize()); } public LruBitmapCache(int sizeInKiloBytes) { super(sizeInKiloBytes); } @Override protected int sizeOf(String key, Bitmap value) { return value.getRowBytes() * value.getHeight() / 1024; } @Override public Bitmap getBitmap(String url) { return get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { put(url, bitmap); } }
別忘記在AndroidManifest.xml文件中添加android.permission.INTERNET權限。
HTTP請求實例
private Context mContext; private RequestQueue mRequestQueue; private StringRequest mStringRequest; // 利用Volley實現Post請求 private void volley_post() { String url = "http://aplesson.com/wap/api/user.php?action=login"; mContext = this; mRequestQueue = Volley.newRequestQueue(mContext); mStringRequest = new StringRequest(Method.POST, url, new Response.Listener<String>() { @Override public void onResponse(String response) { System.out.println("請求結果:" + response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { System.out.println("請求錯誤:" + error.toString()); } }) { // 攜帶參數 @Override protected HashMap<String, String> getParams() throws AuthFailureError { HashMap<String, String> hashMap = new HashMap<String, String>(); hashMap.put("un", "852041173"); hashMap.put("pw", "852041173abc"); return hashMap; } // Volley請求類提供了一個 getHeaders()的方法,重載這個方法可以自定義HTTP 的頭信息。(也可不實現) public Map<String, String> getHeaders() throws AuthFailureError { HashMap<String, String> headers = new HashMap<String, String>(); headers.put("Accept", "application/json"); headers.put("Content-Type", "application/json; charset=UTF-8"); return headers; } }; mRequestQueue.add(mStringRequest); } private JsonObjectRequest mJsonObjectRequest; // 利用Volley實現Json數據請求 private void volley_json() { mContext = this; String url = "http://aplesson.com/data/101010100.html"; // 1 創建RequestQueue對象 mRequestQueue = Volley.newRequestQueue(mContext); // 2 創建JsonObjectRequest對象 mJsonObjectRequest = new JsonObjectRequest(url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { System.out.println("請求結果:" + response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { System.out.println("請求錯誤:" + error.toString()); } }); // 3 將JsonObjectRequest添加到RequestQueue mRequestQueue.add(mJsonObjectRequest); } // 利用Volley實現Get請求 private void volley_get() { mContext = this; String url = "http://www.aplesson.com/"; // 1 創建RequestQueue對象 mRequestQueue = Volley.newRequestQueue(mContext); // 2 創建StringRequest對象 mStringRequest = new StringRequest(url, new Response.Listener<String>() { @Override public void onResponse(String response) { System.out.println("請求結果:" + response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { System.out.println("請求錯誤:" + error.toString()); } }); // 3 將StringRequest添加到RequestQueue mRequestQueue.add(mStringRequest); }
Volley提供了JsonObjectRequest、JsonArrayRequest、StringRequest等Request形式。JsonObjectRequest:返回JSON對象。
JsonArrayRequest:返回JsonArray。
StringRequest:返回String,這樣可以自己處理數據,更加靈活。
另外可以繼承Request<T>自定義Request。
取消Request
Activity裡面啟動了網絡請求,而在這個網絡請求還沒返回結果的時候,Activity被結束了,此時如果繼續使用其中的Context等,除了無辜的浪費CPU,電池,網絡等資源,有可能還會導致程序crash,所以,我們需要處理這種一場情況。使用Volley的話,我們可以在Activity停止的時候,同時取消所有或部分未完成的網絡請求。Volley裡所有的請求結果會返回給主進程,如果在主進程裡取消了某些請求,則這些請求將不會被返回給主線程。Volley支持多種request取消方式。
可以針對某些個request做取消操作:
@Override public void onStop() { for (Request <?> req : mRequestQueue) { req.cancel(); } }
取消這個隊列裡的所有請求:
@Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); mRequestQueue.cancelAll(this); }
可以根據RequestFilter或者Tag來終止某些請求
@Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); mRequestQueue.cancelAll( new RequestFilter() {}); or mRequestQueue.cancelAll(new Object()); }
Volley支持http的GET、POST、PUT、DELETE等方法。
你以為頭像更換很容易?或許對於用戶來講,在微信上更換一個頭像只是點擊頭像,選擇拍照或相冊,裁剪返回而已。但是對於程序員來說,要實現其實也挺吃力的(小火柴花了一個下午整理~
關於IPC應該不用多介紹了,Android系統中的進程之間不能共享內存,那麼如果兩個不同的應用程序之間需要通訊怎麼辦呢?比如公司的一個項目要更新,產品的需求是依附於當前項
1.應用場景ProgressBar主要的應用場景在於對網絡請求,數據加載顯示時由於需要用戶等待,如果沒有提示有可能造成用戶退出,或者誤認為程序錯誤,增加ProgressB
繼插件化後,熱補丁技術在2015年開始爆發,目前已經是非常熱門的Android開發技術。其中比較著名的有淘寶的Dexposed、支付寶的AndFix以及QZone的超級熱