Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Volley,小並發網絡請求的好幫手

Volley,小並發網絡請求的好幫手

編輯:關於Android編程

不得不說,當不了解一件事情的時候,就會像當然的認為,其很神秘。但是當真正的接觸到了這些神秘的item,就不會有這種感覺了。作為一個android開發新手的我,剛接觸到了Volley這個開源的網絡請求框架,就瞬間被她打動了。下面我就談一談我對Volley的一些理解。


Volley是什麼?

Volley是谷歌在2013年的I/O大會上發布的一個網絡請求的框架,Volley在性能方面進行了大幅度的調整,它的設計目標就是非常適合去進行數據量不大,但通信頻繁的網絡操作,而對於大數據量的網絡操作,比如說下載文件等,Volley的表現就會非常糟糕。其模型如圖所示。 這裡寫圖片描述

Volley怎麼用?

說到了Volley的使用方法,我們就需要先了解一下這個框架的實現業務的流程了,如下:這裡寫圖片描述

然後就是了解一下API中相關的常用的幾個類及其用法了。

Volley:Volley 對外暴露的 API,通過 newRequestQueue(…) 函數新建並啟動一個請求隊列RequestQueue。 Request:表示一個請求的抽象類。StringRequest、JsonRequest、ImageRequest都是它的子類,表示某種類型的請求。 RequestQueue:表示請求隊列,裡面包含一個CacheDispatcher(用於處理走緩存請求的調度線程)、NetworkDispatcher數組(用於處理走網絡請求的調度線程),一個ResponseDelivery(返回結果分發接口),通過 start() 函數啟動時會啟動CacheDispatcher和NetwZ喎?/kf/ware/vc/" target="_blank" class="keylink">vcmtEaXNwYXRjaGVyc6GjIDxicj4KQ2FjaGVEaXNwYXRjaGVyo7rSu7j2z9+zzKOs08PT2rX3tsi0psDt19+7urTmtcTH68fzoaPG9LavuvO74bK7ts+007u6tObH68fzttPB0NbQyKHH68fztKbA7aOsttPB0M6qv9XU8rXItP2jrMfrx/O0psDtveHK+NTyvau94bn7tKu13bj4UmVzcG9uc2VEZWxpdmVyecil1rTQ0Lrz0Pi0psDtoaO1sb3hufvOtLu6tOa5/aGiu7q05sqn0Ke78ru6tObQ6NKqy6LQwrXEx+m/9s/Co6y4w8frx/O2vNDo0qrW2NDCvfhOZXR3b3JrRGlzcGF0Y2hlcsiltfe2yLSmwO2howogTmV0d29ya0Rpc3BhdGNoZXKjutK7uPbP37PMo6zTw9Patfe2yLSmwO3X3834wue1xMfrx/Oho8b0tq+687vhsru2z7TTzfjC58frx/O208HQ1tDIocfrx/O0psDto6y208HQzqq/1dTytci0/aOsx+vH87SmwO294cr41PK9q73hufu0q7XduPhSZXNwb25zZURlbGl2ZXJ5yKXWtNDQuvPQ+LSmwO2jrLKixdC2z73hufvKx7fx0qq9+NDQu7q05qGjClJlc3BvbnNlRGVsaXZlcnmjure1u9i94bn7t9a3or3Tv9qjrMS/x7DWu9PQu/nT2kV4ZWN1dG9yRGVsaXZlcnm1xNTayOuyziBoYW5kbGVyILbU06bP37PMxNq9+NDQt9a3oqGjCkh0dHBTdGFja6O6tKbA7SBIdHRwIMfrx/OjrLe1u9jH68fzveG5+6GjxL/HsCBWb2xsZXkg1tDT0Lv509ogSHR0cFVSTENvbm5lY3Rpb24gtcRIdXJsU3RhY2u6zSC7+dPaIEFwYWNoZSBIdHRwQ2xpZW50ILXESHR0cENsaWVudFN0YWNroaMKTmV0d29ya6O6tffTw0h0dHBTdGFja7SmwO3H68fzo6yyor2rveG5+9equ7vOqr/JsbtSZXNwb25zZURlbGl2ZXJ5tKbA7bXETmV0d29ya1Jlc3BvbnNloaMgPGJyPgpDYWNoZaO6u7q05sfrx/O94bn7o6xWb2xsZXkgxKzIz8q508O1xMrHu/nT2iBzZGNhcmQgtcQKRGlza0Jhc2VkQ2FjaGWho05ldHdvcmtEaXNwYXRjaGVytcO1vcfrx/O94bn7uvPF0LbPyse38dDo0qq05rSi1NogQ2FjaGWjrENhY2hlRGlzcGF0Y2hlcrvhtNMgQ2FjaGUg1tDIobu6tOa94bn7oaMKCgo8cD66w8HLuMPWqrXAtcTO0sPH0rKy7rK7tuC2vNaqtcDBy6Osz8LD5r7NwLTSu7j20KHA/dfTyrW8yrXEzOXR6dK7sNGwyaGjPC9wPgoKPGg0IGlkPQ=="我的volley小例子">我的Volley小例子

我要完成的是點擊一個按鈕,然後在下邊的兩個ImageView上顯示一張圖片。那麼,開始吧。
首先我們要做的就是在我們新建的工程的libs目錄下導入需要的Volley.jar包。然後並把其classpath導入。
然後就是設計布局,完善業務邏輯代碼。請看下面的詳細的解釋。

首先是布局文件:



    

然後是Java代碼:

package com.guoribiao.volleytest;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v4.util.LruCache;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageLoader.ImageCache;
import com.android.volley.toolbox.ImageLoader.ImageListener;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.Volley;

public class MainActivity extends Activity {

    private Button mButton;
    private ImageView mImageview;
    private NetworkImageView networkImageView;

    public void initView() {
        mButton = (Button) findViewById(R.id.btn_getimage);
        mImageview = (ImageView) findViewById(R.id.imageview);
        networkImageView = (NetworkImageView) findViewById(R.id.network_image_view);
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    public void setImageTo(View view ){
        setImage();
        setImageByNetworkImageView();
    }


    /**
     * 使用volley自帶的一個網絡圖片控件實現網絡圖片的加載
     */
    private void setImageByNetworkImageView() {
        //設置網絡請求的圖片的URL地址
        String requestUrl = "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1461212709&di=978a557d108c531a9f76f225454d0c5b&src=/uploadfile/2016/0422/20160422091643737.jpeg";
        //創建一個請求隊列
        RequestQueue queue = Volley.newRequestQueue(this);
        //使用緩存機制緩存圖片
        final LruCache lruCache = new LruCache(20);
        //借助於上面的lrucache實現ImageCache的設置
        ImageCache imageCache = new ImageCache(){
            @Override
            public Bitmap getBitmap(String url) {
                lruCache.get(url);
                return null;
            }
            @Override
            public void putBitmap(String url, Bitmap bitmap) {
                lruCache.put(url, bitmap);
            }
        };
        //創建一個圖片加載器
        ImageLoader imageLoader = new ImageLoader(queue,imageCache);
        //給控件設置標簽
        networkImageView.setTag("url");
        //設置將要顯示的圖片的URL和圖片加載器
        networkImageView.setImageUrl(requestUrl, imageLoader);
    }


    /**
     * 借助於Volley加載網絡上的一張圖片到一個ImageView控件上
     */
    private void setImage() {
        //將ImageView設置為可見的狀態
        mImageview.setVisibility(1);
        //設置一個請求隊列
        RequestQueue queue = Volley.newRequestQueue(this);
        //設置圖片所在的URL的地址
        String imageUrl = "http://www.baidu.com/img/bd_logo1.png";
        //設置一個lrucache
        final LruCache< String , Bitmap > cache = new LruCache(20);
        //生成一個圖片緩存器
        ImageCache imageCache = new ImageCache(){

            @Override
            public Bitmap getBitmap(String url) {
                cache.get(url);
                return null;
            }
            @Override
            public void putBitmap(String url, Bitmap bitmap) {
                cache.put(url, bitmap);
            }
        };

        //初始化一個圖片加載器
        ImageLoader imageLoader = new ImageLoader(queue,imageCache);
        //設置圖片加載過程中的一個偵聽,並添加到要進行顯示的控件上
        ImageListener listener = ImageLoader.getImageListener(mImageview, R.drawable.ic_launcher, R.drawable.error);
        //設置加載的URL地址和監聽器
        imageLoader.get(imageUrl, listener);
    }

}

最後,別忘了在manifest.xml清單文件中聲明一下網絡權限。

最後來看一下測試的結果吧。
這裡寫圖片描述
這裡寫圖片描述
而且,當我們剛點擊按鈕的時候會發現,上面的那個ImageView控件會顯示一個默認的ic_launcher圖標.這是因為它剛剛正在加載。加載完成後,就會顯示正常的網絡圖片了。

總結

使用Volley的話,適合於那些小流量,請求次數頻繁的網絡請求,不適合於大數據的下載,所以我們需要按照自己的需求來選擇使用。

改進的方向:
別人的,雖然好用,但是不是最適合自己的。我們可以在Volley的基礎上,創建自己的網絡請求資源代碼庫,比如說將特殊需求的網絡請求進行二次封裝,這樣可以省去很多時間編寫重復性的代碼。還能有效的處理。何樂而不為呢。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved