編輯:關於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.Listener listener, 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";
Map map = 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 Map map, 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";
Map map = 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.Listener listener, 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應用程序窗口設計框架介紹
在Android系統中,一個Activity對應一個應用程序窗口,任何一個Activity的啟動都是由AMS服務和應用程序進程相互配合來完成的。AMS服務統一調度系統中所
Android 數字跳動顯示:DancingNumberView
簡介DancingNumberView是一個用於跳動顯示文本中數字的控件,繼承自TextView.這種控件一般用於顯示金額等對用戶較為敏感的數字,讓UI交互更加生動.它具
Android開發之監聽手機來電
TelephonyManager是一個管理手機通話狀態、電話網絡信息的服務類,該類提供了大量的getXxx(),方法獲取電話網絡的相關信息。關於TelephonyMana
Android-studio+Genymotion模擬器的聯合使用
(1)關於安裝Android studio的方法: 安裝完,再從上述網址下載個別sdk包(在android-studio的sdk manager裡也可以下載,但是經常被