Android熱門網絡框架Volley詳解

.Volley簡介php

volley的英文意思爲‘羣發’、‘迸發’。Volley是2013年穀歌官方發佈的一款Android平臺上的網絡通訊庫。Volley很是適合一些數據量不大,但須要頻繁通訊的網絡操做。使用Volley進行網絡開發可使咱們的開發效率獲得很大的提高,並且性能的穩定性也比較高。可是Volley不適用於文件的上傳下載操做。html

Volley的特色:java

>1 使網絡通訊更快,更簡單,更健壯;android

>2 Get/Post網絡請求及網絡圖像的高效率異步請求;  json

>3 能夠對網絡請求的優先級進行排序處理;緩存

>4 能夠進行網絡請求的緩存;網絡

>5 能夠取消多級別請求;app

>6 能夠和Activity生命週期聯動。異步

爲何要使用Volley?ide

功能上:

高效的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; } }

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.cbt.learnvolley" xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 添加網絡操做權限 -->
    <uses-permission android:name="android.permission.INTERNET"/>

    <!-- 註冊自定義的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>

 

.使用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); } }

 

運行結果:

.使用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:請求成功後的回調 * errorListener:請求失敗的回調 */
private void volleyGet() { String url = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.4.255.255"; JsonObjectRequest request = new JsonObjectRequest(Method.GET, url, null, new Listener<JSONObject>() { @Override public void onResponse(JSONObject jsonObject) {//jsonObject爲請求返回的Json格式數據
                    Toast.makeText(MainActivity.this,jsonObject.toString(),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); }

 

運行結果:

返回JsonArrayRequest對象的方法與JsonObjectRequest比較相似,這裏就再也不演示,請你們自行實現。

.使用Post方式請求數據返回StringRequest對象

使用Post方式須要手動傳遞請求參數,能夠重寫Request類的getParams()方法將請求參數名和參數值放入Map中進行傳遞。

MainActivity.java

public class MainActivity extends AppCompatActivity { @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 = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm"; StringRequest request = new StringRequest(Method.POST, 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; } } ; //設置請求的Tag標籤,能夠在全局請求隊列中經過Tag標籤進行請求的查找
        request.setTag("testPost"); //將請求加入全局隊列中
 MyApplication.getHttpQueues().add(request); } }

 

.使用Post方式請求數據返回JsonObject對象

/** * 使用Post方式返回JsonObject類型的請求結果數據 * * 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:請求成功後的回調 * errorListener:請求失敗的回調 */
private void volleyPost() { String url = "http://www.kuaidi100.com/query"; Map<String,String> map = new HashMap<>(); map.put("type","yuantong"); map.put("postid","229728279823"); //將map轉化爲JSONObject對象
    JSONObject jsonObject = new JSONObject(map); JsonObjectRequest request = new JsonObjectRequest(Method.POST, url, jsonObject, new Listener<JSONObject>() { @Override public void onResponse(JSONObject jsonObject) {//jsonObject爲請求返回的Json格式數據
                    Toast.makeText(MainActivity.this,jsonObject.toString(),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("testPost"); //將請求加入全局隊列中
 MyApplication.getHttpQueues().add(request); }

 

.與Activity生命週期聯動

能夠在Activity關閉時取消請求隊列中的請求。

@Override protected void onStop() { super.onStop(); //經過Tag標籤取消請求隊列中對應的所有請求
    MyApplication.getHttpQueues().cancelAll("abcGet"); }

 

.使用ImageRequest加載網絡圖片

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);
 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 = "http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg"; ImageRequest request = new ImageRequest( 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); } }

 

運行結果:

.使用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); } }

 

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); } }

 

運行結果:

完整源碼:點擊下載

 

做者: caobotao
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文連接,不然保留追究法律責任的權利。
相關文章
相關標籤/搜索