Android熱門網絡框架Volley詳解
.Volley簡介
volley的英文意思為‘群發’、‘迸發’。Volley是2013年谷歌官方發布的一款Android平臺上的網絡通信庫。Volley非常適合一些數據量不大,但需要頻繁通信的網絡操作。使用Volley進行網絡開發可以使我們的開發效率得到很大的提升,而且性能的穩定性也比較高。但是Volley不適用于文件的上傳下載操作。
Volley的特點:
>1 使網絡通信更快,更簡單,更健壯;
>2 Get/Post網絡請求及網絡圖像的高效率異步請求;
>3 可以對網絡請求的優先級進行排序處理;
>4 可以進行網絡請求的緩存;
>5 可以取消多級別請求;
>6 可以和Activity生命周期聯動。
為什么要使用Volley?
功能上:
高效的Get/Post方式的數據請求交互;
網絡圖片的加載和緩存過程簡單化。
其他:
谷歌官方退出的,比較權威;
性能很穩定、強勁。
.使用Volley
1.Volley的網絡請求隊列建立與取消隊列請求
使用Volley需要建立一個全局的請求隊列,這樣我們就可以將一個請求加入到這個全局隊列中,并可以管理整個APP的所有請求,包括取消一個或所有的請求。
2.Volley的Get和Post請求方式的使用
Volley的Get和Post請求方式其實是對Android原生Get和Post請求方式進行了二次封裝,對效率等進行優化。在使用Get和Post請求方式之前,我們要確定所請求的數據返回什么對象,Volley自帶了三種返回類型:
StringRequest :主要使用在對請求數據的返回類型不確定的情況下,StringRequest涵蓋了JsonObjectRequest和JsonArrayRequest。
JsonObjectRequest :當確定請求數據的返回類型為JsonObject時使用。
JsonArrayRequest :當確定請求數據的返回類型為JsonArray時使用。
3.Volley與Activity生命周期的聯動
簡單來說就是Volley中的請求是與Activity的生命周期進行關聯。這樣可以在Android銷毀時關閉Volley的請求,防止請求在后臺運行造成內存溢出等情況發生。與Activity生命周期進行聯動時需要設置Tag標簽,因為取消請求需要在請求隊列中通過Tag標簽進行查找,在Activity的onStop中執行取消請求的操作。
下面通過代碼進行實例的演示。
使用Volley前需要往項目中導入Volley的jar包。沒有的可以直接點此下載:volley.jar
首先我們需要自定義一個Application用于創建一個全局的請求隊列。
MyApplication.java
public class MyApplication extends Application{ private static RequestQueue queues ; @Override public void onCreate() { super.onCreate(); queues = Volley.newRequestQueue(getApplicationContext()); }public static RequestQueue getHttpQueues() { return queues; }
}</pre>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest package="com.cbt.learnvolley" xmlns:android="; <!-- 添加網絡操作權限 --> <uses-permission android:name="android.permission.INTERNET"/>//設置請求的Tag標簽,可以在全局請求隊列中通過Tag標簽進行請求的查找 request.setTag("testPost"); //將請求加入全局隊列中 MyApplication.getHttpQueues().add(request); } }</pre><!-- 注冊自定義的Application:android:name=".MyApplication" --> <application android:name=".MyApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application>
</manifest></pre>
.使用Get方式請求數據返回StringRequest對象
當想返回String類型的請求結果數據或者不清楚返回什么類型時可以用StringRequest對象。
下面使用Get請求方式返回一個String類型的手機歸屬地信息。
MainActivity.java
public class MainActivity extends AppCompatActivity {@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); volleyGet(); } /** * new StringRequest(int method,String url,Listener listener,ErrorListener errorListener) * method:請求方式,Get請求為Method.GET,Post請求為Method.POST * url:請求地址 * listener:請求成功后的回調 * errorListener:請求失敗的回調 */ private void volleyGet() { String url = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443"; StringRequest request = new StringRequest(Method.GET, url, new Listener<String>() { @Override public void onResponse(String s) {//s為請求返回的字符串數據 Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show(); } }, new ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show(); } }); //設置請求的Tag標簽,可以在全局請求隊列中通過Tag標簽進行請求的查找 request.setTag("testGet"); //將請求加入全局隊列中 MyApplication.getHttpQueues().add(request); }
}</pre>
運行結果:
![]()
.使用Get方式請求數據返回JsonObjectRequest對象
由于我們知道這個請求返回的是Json格式的數據,所以我們可以直接使用JsonObjectRequest作為請求返回結果對象。
下面使用Get請求方式返回一個Json格式的IP地址信息,這里只是展示一下返回的數據信息,具體的Json解析方法大家可自行研究。
/**
- new JsonObjectRequest(int method,String url,JsonObject jsonObject,Listener listener,ErrorListener errorListener)
- method:請求方式,Get請求為Method.GET,Post請求為Method.POST
- url:請求地址
- JsonObject:Json格式的請求參數。如果使用的是Get請求方式,請求參數已經包含在url中,所以可以將此參數置為null
- listener:請求成功后的回調
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); volleyPost();
}
/**
- 使用Post方式返回String類型的請求結果數據
- new StringRequest(int method,String url,Listener listener,ErrorListener errorListener)
- method:請求方式,Get請求為Method.GET,Post請求為Method.POST
- url:請求地址
- listener:請求成功后的回調
- errorListener:請求失敗的回調 */ private void volleyPost() { String url = "
new Listener<String>() { @Override public void onResponse(String s) {//s為請求返回的字符串數據 Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show(); } }, new ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show(); } }){ @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String,String> map = new HashMap<>(); //將請求參數名與參數值放入map中 map.put("tel","15850781443"); return map; } } ;
.使用Post方式請求數據返回JsonObject對象
/**
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = (ImageView) findViewById(R.id.image);
loadImageByVolley();
}
/**
- 通過Volley加載網絡圖片 *
- new ImageRequest(String url,Listener listener,int maxWidth,int maxHeight,Config decodeConfig,ErrorListener errorListener)
- url:請求地址
- listener:請求成功后的回調
- maxWidth、maxHeight:設置圖片的最大寬高,如果均設為0則表示按原尺寸顯示
- decodeConfig:圖片像素的儲存方式。Config.RGB_565表示每個像素占2個字節,Config.ARGB_8888表示每個像素占4個字節等。
errorListener:請求失敗的回調 */ private void loadImageByVolley() { String url = "
url, new Listener<Bitmap>() { @Override public void onResponse(Bitmap bitmap) { image.setImageBitmap(bitmap); } }, 0, 0, Config.RGB_565, new ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { image.setImageResource(R.mipmap.ic_launcher); } });
//設置請求的Tag標簽,可以在全局請求隊列中通過Tag標簽進行請求的查找 request.setTag("loadImage"); //通過Tag標簽取消請求隊列中對應的全部請求 MyApplication.getHttpQueues().add(request); }
}</pre>
運行結果:
.使用ImageLoader加載及緩存網絡圖片
MainActivity.java
public class MainActivity extends AppCompatActivity { private ImageView image; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); image = (ImageView) findViewById(R.id.image); loadImageWithCache(); } /*** 通過ImageLoader加載及緩存網絡圖片
*
* new ImageLoader(RequestQueue queue,ImageCache imageCache) * queue:請求隊列 * imageCache:一個用于圖片緩存的接口,一般需要傳入它的實現類 * * getImageListener(ImageView view, int defaultImageResId, int errorImageResId) * view:ImageView對象 * defaultImageResId:默認的圖片的資源Id * errorImageResId:網絡圖片加載失敗時顯示的圖片的資源Id */ private void loadImageWithCache() { String url = "http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg"; ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(), new BitmapCache()); ImageListener listener = loader.getImageListener(image,R.mipmap.ic_launcher,R.mipmap.ic_launcher); //加載及緩存網絡圖片 loader.get(url,listener); }
}</pre>
BitmapCache.java
public class BitmapCache implements ImageLoader.ImageCache{ //LruCache是基于內存的緩存類 private LruCache<String,Bitmap> lruCache; //LruCache的最大緩存大小 private int max = 10 1024 1024;public BitmapCache() { lruCache = new LruCache<String, Bitmap>(max){ @Override //緩存圖片的大小 protected int sizeOf(String key, Bitmap value) { return value.getRowBytes() * value.getHeight(); } }; } @Override public Bitmap getBitmap(String s) { return lruCache.get(s); } @Override public void putBitmap(String s, Bitmap bitmap) { lruCache.put(s,bitmap); }
}</pre>
運行結果:
</div> 原文 http://www.cnblogs.com/caobotao/p/5071658.html
![]()