編輯:關於Android編程
/** * Created by androidlongs on 16/7/1. * 網絡請求訪問框架 */ public class VollyRequestUtils { /** * Volley框架使用工具類對象 */ private static VollyRequestUtils vollyRequestUtils; /** * 網絡消息請求隊列 */ private static RequestQueue requestQueue; private VollyRequestUtils() { /** * 初始化請求消息隊列 */ getVolleyQueyInstanse(); } /** * 獲取消息工具類請求對象實體 * * @return */ public static VollyRequestUtils getInstance() { if (vollyRequestUtils == null) { synchronized (VollyRequestUtils.class) { if (vollyRequestUtils == null) { vollyRequestUtils = new VollyRequestUtils(); } } } return vollyRequestUtils; } /** * 獲取消息請求隊列 */ public void getVolleyQueyInstanse() { if (requestQueue == null) { synchronized (VollyRequestUtils.class) { if (requestQueue == null) { requestQueue = Volley.newRequestQueue(App.getContext()); } } } } }
備注說明:
這裡采用單例設計模式,其中創建請求消息隊列 requestQueue傳入的是一個Application對象
public class App extends Application { private static Context context; @Override public void onCreate() { super.onCreate(); context = this; } public static Context getContext(){ return context; } }
/** * get 請求 * * @param url 網絡請求url * @param netTag 網絡請求標識 * @param isCache 設置緩存標識 * @param listener 請求成功回調 * @param errorlistener 請求失敗回調 */ public void asyGetStringRequest(String url, String netTag, boolean isCache, Response.Listenerlistener, Response.ErrorListener errorlistener) { /** * 在發起請求前先取消隊列中有此標簽的網絡,避免多次重復請求問題 */ requestQueue.cancelAll(netTag); /** * 獲取請求對象 * 並設置相關的監聽 */ StringRequest request = new StringRequest(Request.Method.GET, url, listener, errorlistener); /** * 設置網絡請求標識 */ request.setTag(netTag); /** * 設置網絡請求緩存 */ request.setShouldCache(isCache); /** * 添加到隊列中 */ requestQueue.add(request); }
final String url = "http://172.19.1.45:8080/OkhttpAppLication/test"; final String netTag = "getString"; VollyRequestUtils.getInstance().asyGetStringRequest(url, netTag, false, new Response.Listener() { @Override public void onResponse(String s) { System.out.println("get String success " + s); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { System.out.println("get String onErrorResponse " + volleyError.getMessage()); } });
/** * post請求 提交KEY - VALEU 形式的數據 * * @param url * @param netTag * @param map * @param isCache * @param listener * @param errorListener */ public void asyncPostStringQuest(String url, String netTag, final Map使用方法:map, boolean isCache, Response.Listener listener, Response.ErrorListener errorListener) { /** * 取消此標識下的所有網絡請求,避免重復提交 */ requestQueue.cancelAll(netTag); /** * 獲取Request對象 並封裝相應的參數 */ StringRequest request = new StringRequest(Request.Method.POST, url, listener, errorListener) { @Override protected Map getParams() throws AuthFailureError { /** * 封裝請求參數 */ if (map != null && !map.isEmpty()) { return map; } else { return super.getParams(); } } }; /** * 設置緩存 */ request.setShouldCache(isCache); /** * 設置網絡請求標識 */ request.setTag(netTag); requestQueue.add(request); }
final String url = "http://172.19.1.45:8080/OkhttpAppLication/test"; final String netTag = "postString"; Mapmap = new HashMap<>(); map.put("username", "postUsername"); map.put("password", "postPassword"); VollyRequestUtils.getInstance().asyncPostStringQuest(url, netTag, map, false, new Response.Listener () { @Override public void onResponse(String s) { System.out.println("post String success " + s); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { System.out.println("post String onErrorResponse " + volleyError.getMessage()); } }); }
/** * 提交 JSON數據到服務器 * * @param url 網絡請求URL * @param netTag 網絡請求標識 * @param map 網絡請求提交參數 * @param isCache 緩存請求標識 * @param listener 成功監聽 * @param errorListener 失敗監聽 */ public void asynePostJsonObjRequest(String url, String netTag, final Mapmap, boolean isCache, Response.Listener listener, Response.ErrorListener errorListener) { requestQueue.cancelAll(netTag); /** * 封裝參數 */ JSONObject object = new JSONObject(); try { if (map != null && !map.isEmpty()) { for (Map.Entry entry : map.entrySet()) { object.put(entry.getKey(), entry.getValue()); } } } catch (Exception e) { e.printStackTrace(); } /** * 創建請求Request */ JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, object, listener, errorListener); /** * 設置網絡請求標識 */ jsonObjectRequest.setTag(netTag); /** * 設置緩存 */ jsonObjectRequest.setShouldCache(isCache); requestQueue.add(jsonObjectRequest); }
final String url = "http://172.19.1.45:8080/OkhttpAppLication/test"; final String netTag = "postString"; Mapmap = new HashMap<>(); map.put("username", "postUsername---45"); map.put("password", "postPassword---45"); VollyRequestUtils.getInstance().asynePostJsonObjRequest(url,netTag,map,false,new Response.Listener (){ @Override public void onResponse(JSONObject jsonObject) { JSONObject j = jsonObject; } },new Response.ErrorListener(){ @Override public void onErrorResponse(VolleyError volleyError) { } });
/** * 加載圖片請求 * @param url 加載圖片的URL * @param netTag 加載圖片的網絡請求標識 * @param imageMaxWidth 加載圖片的最大寬度 * @param imageMaxHeight 加載圖片的最大高度 * @param listener 加載成功監聽 * @param errorListener 加載失敗監聽 */ public void asyPostImageRequest(String url, String netTag, int imageMaxWidth, int imageMaxHeight, Response.Listenerlistener, Response.ErrorListener errorListener) { requestQueue.cancelAll(netTag); /** * 創建獲取request * 並設置相關的監聽與參數 */ ImageRequest request = new ImageRequest(url, listener, imageMaxWidth, imageMaxHeight, ImageView.ScaleType.MATRIX, Bitmap.Config.ARGB_8888, errorListener); /** * 設置加載緩存 */ request.setShouldCache(true); /** * 設置網絡請求標識 */ request.setTag(netTag); /** * 設置請求超時時間 */ request.setRetryPolicy(new DefaultRetryPolicy(15000,3000,3000)); requestQueue.add(request); }
final String url = "http://e.hiphotos.baidu.com/image/pic/item/14ce36d3d539b600be63e95eed50352ac75cb7ae.jpg"; final String netTag = "imagerequest"; VollyRequestUtils.getInstance().asyPostImageRequest(url, netTag, screeWidht, screeHeight, new Response.Listener() { @Override public void onResponse(Bitmap bitmap) { System.out.println("image request success "); if (bitmap != null) { imageView.setImageBitmap(bitmap); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { System.out.println("image request faile "); } });
/** * 加載多張圖片 * * @param url * @param imageView * @param imageMaxWidth * @param imageMaxHeight */ public void asyVolleyImageLoaderRequest(String url, ImageView imageView, int imageMaxWidth, int imageMaxHeight) { ImageLoader imageLoaderInstance = getImageLoaderInstance(); // getImageListener(imageView控件對象,默認圖片地址,失敗圖片地址); ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate, android.R.drawable.ic_delete); // get(圖片地址,listener,寬,高);自動幫你處理圖片的寬高再也不怕大圖片的oom了 imageLoaderInstance.get(url, listener, imageMaxWidth, imageMaxHeight, ImageView.ScaleType.MATRIX); } private static ImageLoader imageLoader; /** * 獲取 Imageloader對象 * @return */ private ImageLoader getImageLoaderInstance() { if (imageLoader == null) { synchronized (VollyRequestUtils.class) { if (imageLoader == null) { imageLoader = new ImageLoader(requestQueue, new BitmapLruCache()); } } } return imageLoader; }
final String url = "http://e.hiphotos.baidu.com/image/pic/item/14ce36d3d539b600be63e95eed50352ac75cb7ae.jpg"; final String netTag = "postString"; VollyRequestUtils.getInstance().asyVolleyImageLoaderRequest(url, imageView, screeWidht, screeHeight);
public class BitmapLruCache extends LruCacheimplements ImageLoader.ImageCache { /** * LruCache 原理:Cache保存一個強引用來限制內容數量,每當Item被訪問的時候,此Item就會移動到隊列的頭部。 * 當cache已滿的時候加入新的item時,在隊列尾部的item會被回收。 * 解釋:當超出指定內存值則移除最近最少用的圖片內存 */ public static int getDefaultLruCacheSize() { // 拿到最大內存 final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); // 拿到內存的八分之一來做圖片內存緩存 final int cacheSize = maxMemory / 8; return cacheSize; } public BitmapLruCache() { this(getDefaultLruCacheSize()); } public BitmapLruCache(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); } }
布局文件中的xml中使用方法
/** * 這個控件在被從父控件detach的時候,會自動取消網絡請求的,即完全不用我們擔心相關網絡請求的生命周期問題,而且NetworkImageView還會根據你對圖片設置的width和heigh自動壓縮該圖片不會產生多的內存,還有NetworkImageView在列表中使用不會圖片錯誤 * * @param iv * @param url */ private void networkImageViewUse(NetworkImageView iv, String url) { ImageLoader imLoader = new ImageLoader(Volley.newRequestQueue(App.getContext()), new BitmapLruCache()); iv.setDefaultImageResId(android.R.drawable.ic_menu_rotate); iv.setErrorImageResId(android.R.drawable.ic_delete); iv.setImageUrl(url, imLoader); }
8、自定義Request請求
在Android系統中,一個Activity對應一個應用程序窗口,任何一個Activity的啟動都是由AMS服務和應用程序進程相互配合來完成的。AMS服務統一調度系統中所
簡介DancingNumberView是一個用於跳動顯示文本中數字的控件,繼承自TextView.這種控件一般用於顯示金額等對用戶較為敏感的數字,讓UI交互更加生動.它具
TelephonyManager是一個管理手機通話狀態、電話網絡信息的服務類,該類提供了大量的getXxx(),方法獲取電話網絡的相關信息。關於TelephonyMana
(1)關於安裝Android studio的方法: 安裝完,再從上述網址下載個別sdk包(在android-studio的sdk manager裡也可以下載,但是經常被