Android熱門網絡框架Volley詳解

jopen 9年前發布 | 13K 次閱讀 Volley Android開發 移動開發

.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"/>

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

運行結果:

Android熱門網絡框架Volley詳解

.使用Get方式請求數據返回JsonObjectRequest對象

由于我們知道這個請求返回的是Json格式的數據,所以我們可以直接使用JsonObjectRequest作為請求返回結果對象。

下面使用Get請求方式返回一個Json格式的IP地址信息,這里只是展示一下返回的數據信息,具體的Json解析方法大家可自行研究。

/**

  • 使用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 = "

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

    .與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();
    

    }

    /**

  • }</pre>

    運行結果:

    Android熱門網絡框架Volley詳解

    .使用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>

    運行結果:

    Android熱門網絡框架Volley詳解

    </div> 原文
    http://www.cnblogs.com/caobotao/p/5071658.html

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!