日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android 网络通信框架volly

發(fā)布時間:2024/9/20 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 网络通信框架volly 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 什么是Volley

在這之前,我們在程序中需要和網絡通信的時候,大體使用的東西莫過于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,今年的Google I/O 2013上,Volley發(fā)布了。Volley是Android平臺上的網絡通信庫,能使網絡通信更快,更簡單,更健壯。
這是Volley名稱的由來: a burst or emission of many things or a large amount at once
在Google IO的演講上,其配圖是一幅發(fā)射火弓箭的圖,有點類似流星。見下圖

其實,從這幅圖,我們也可以看出來,Volley特別適合數據量不大但是通信頻繁的場景。

1.1. Volley引入的背景
在以前,我們可能面臨如下很多麻煩的問題。

比如以前從網上下載圖片的步驟可能是這樣的流程:

  • 在ListAdapter#getView()里開始圖像的讀取。
  • 通過AsyncTask等機制使用HttpURLConnection從服務器去的圖片資源
  • 在AsyncTask#onPostExecute()里設置相應ImageView的屬性。

而在Volley下,只需要一個函數即可,詳細見后面的例子。

再比如,屏幕旋轉的時候,有時候會導致再次從網絡取得數據。為了避免這種不必要的網絡訪問,我們可能需要自己寫很多針對各種情況的處理,比如cache什么的。

再有,比如ListView的時候,我們滾動過快,可能導致有些網絡請求返回的時候,早已經滾過了當時的位置,根本沒必要顯示在list里了,雖然我們可以通過ViewHolder來保持url等來實現防止兩次取得,但是那些已經沒有必須要的數據,還是會浪費系統(tǒng)的各種資源。

1.2. Volley提供的功能
簡單來說,它提供了如下的便利功能:

  • JSON,圖像等的異步下載;
  • 網絡請求的排序(scheduling)
  • 網絡請求的優(yōu)先級處理
  • 緩存
  • 多級別取消請求
  • 和Activity和生命周期的聯(lián)動(Activity結束時同時取消所有網絡請求)

2. 使用前的準備

引入Volley非常簡單,首先,從git庫先克隆一個下來:

[java]?view plaincopy
  • git?clone?https://android.googlesource.com/platform/frameworks/volley??

  • 然后編譯為jar包,再在自己的工程里import進來。

    注意,這個庫要求最低SDK版本為Froyo,即至少要設置android:minSdkVersion為8以上。

    3.使用例子
    下面簡單看看如何使用Volley

    3.1. 最簡單的get請求
    這個例子很簡單,從網絡取得JSON對象,然后打印出來。

    [java]?view plaincopy
  • mQueue?=?Volley.newRequestQueue(getApplicationContext());??
  • mQueue.add(new?JsonObjectRequest(Method.GET,?url,?null,??
  • ????????????new?Listener()?{??
  • ????????????????@Override??
  • ????????????????public?void?onResponse(JSONObject?response)?{??
  • ????????????????????Log.d(TAG,?"response?:?"?+?response.toString());??
  • ????????????????}??
  • ????????????},?null));??
  • mQueue.start();??

  • 3.2. 給ImageView設置圖片源

    [java]?view plaincopy
  • //?imageView是一個ImageView實例??
  • //?ImageLoader.getImageListener的第二個參數是默認的圖片resource?id??
  • //?第三個參數是請求失敗時候的資源id,可以指定為0??
  • ImageListener?listener?=?ImageLoader.getImageListener(imageView,?android.R.drawable.ic_menu_rotate,?android.R.drawable.ic_delete);??
  • mImageLoader.get(url,?listener);??

  • ImageLoader的方法都需要從主線程里來調用。

    3.3. 使用NetworkImageView

    Volley提供了一個新的控件NetworkImageView來代替?zhèn)鹘y(tǒng)的ImageView,這個控件的圖片屬性可以通過

    [java]?view plaincopy
  • mImageView.setImageUrl(url,?imageLoader)??

  • 來設定。而且,這個控件在被從父控件detach的時候,會自動取消網絡請求的,即完全不用我們擔心相關網絡請求的生命周期問題。
    示例代碼如下:

    [java]?view plaincopy
  • mImageLoader?=?new?ImageLoader(mRequestQueue,?new?BitmapLruCache());??
  • ...?...??
  • ???
  • if(holder.imageRequest?!=?null)?{??
  • ????holder.imageRequest.cancel();??
  • }??
  • holder.imageRequest?=?mImageLoader.get(BASE_UR?+?item.image_url,?holder.imageView,?R.drawable.loading,?R.drawable.error);??

  • 注意,這里使用的不是ImageView控件,而是Volley新提供的com.android.volley.NetworkImageView。

    另外,注意這里:

    [java]?view plaincopy
  • mImageLoader?=?new?ImageLoader(mRequestQueue,?new?BitmapLruCache());??

  • ImageLoader構造函數的第二個參數是一個ImageCache的實例(嚴格來說,是實現ImageCache接口的某具體類的實例)
    ImageCache的定義如下(在ImageLoader.java里):

    [java]?view plaincopy
  • /**?
  • ?*?Simple?cache?adapter?interface.?If?provided?to?the?ImageLoader,?it?
  • ?*?will?be?used?as?an?L1?cache?before?dispatch?to?Volley.?Implementations?
  • ?*?must?not?block.?Implementation?with?an?LruCache?is?recommended.?
  • ?*/??
  • public?interface?ImageCache?{??
  • ????public?Bitmap?getBitmap(String?url);??
  • ????public?void?putBitmap(String?url,?Bitmap?bitmap);??
  • }??

  • 下面的網址一個lru的cache實現例子,請參考:

    https://github.com/suwa-yuki/VolleySample/blob/master/src/jp/classmethod/android/sample/volley/BitmapCache.java

    3.5. 使用自己定制的request

    我們也可以通過繼承Request根據自己的需求來定制自己的request

    [java]?view plaincopy
  • @Override??
  • protected?Response?parseNetworkResponse(NetworkResponse?response)?{??
  • ????try?{??
  • ????????String?json?=?new?String(??
  • ????????????????response.data,?HttpHeaderParser.parseCharset(response.headers));??
  • ????????return?Response.success(??
  • ????????????????gson.fromJson(json,?clazz),?HttpHeaderParser.parseCacheHeaders(response));??
  • ????}?catch?(UnsupportedEncodingException?e)?{??
  • ????????return?Response.error(new?ParseError(e));??
  • ????}?catch?(JsonSyntaxException?e)?{??
  • ????????return?Response.error(new?ParseError(e));??
  • ????}??
  • }??

  • 這段代碼節(jié)選自:?https://gist.github.com/ficusk/5474673

    里面使用的gson(com.google.gson.Gson)是JSON的序列化和反序列化的庫,可以在JSON和java model object之間進行轉換。

    以下是使用自定制request的例子:

    [java]?view plaincopy
  • mRequestQueue.add(?new?GsonRequest(url,?ListResponse.class,?null,??
  • ????new?Listener()?{??
  • ????????public?void?onResponse(ListResponse?response)?{??
  • ????????????appendItemsToList(response.item);??
  • ????????????notifyDataSetChanged();??
  • ????????}??
  • ????}??
  • }??

  • 4. Volley的架構設計

    Volley使用了線程池來作為基礎結構,主要分為主線程,cache線程和network線程。
    主線程和cache線程都只有一個,而NetworkDispatcher線程可以有多個,這樣能解決比并行問題。如下圖:


    如果在一個Activity里面啟動了網絡請求,而在這個網絡請求還沒返回結果的時候,如果Activity被結束了,則我們需要寫如下代碼作為防守:

    [java]?view plaincopy
  • @Override?public?void?onPostExecute(Result?r)?{??
  • ????if?(getActivity()?==?null)?{??
  • ????????return;??
  • ????}??
  • ????//?...??
  • }??

  • Activity被終止之后,如果繼續(xù)使用其中的Context等,除了無辜的浪費CPU,電池,網絡等資源,有可能還會導致程序crash,所以,我們需要處理這種一場情況。

    使用Volley的話,我們可以在Activity停止的時候,同時取消所有或部分未完成的網絡請求。

    Volley里所有的請求結果會返回給主進程,如果在主進程里取消了某些請求,則這些請求將不會被返回給主線程。
    比如,可以針對某些個request做取消操作:


    [java]?view plaincopy
  • @Override??
  • public?void?onStop()?{??
  • ????for?(Request?<?>?req?:?mInFlightRequests)?{??
  • ????????req.cancel();??
  • ????}??
  • ????...??
  • }??

  • 或者,取消這個隊列里的所有請求:

    [java]?view plaincopy
  • @Override?pubic?void?onStop()?{??
  • ????mRequestQueue.cancelAll(this);??
  • ????...??
  • }??

  • 也可以根據RequestFilter或者Tag來終止某些請求:

    [java]?view plaincopy
  • @Override?public?void?onStop()?{??
  • ????mRequestQueue.cancelAll(?new?RequestFilter()?{})??
  • ????...??
  • ????//?or??
  • ????mRequestQueue.cancelAll(new?Object());??
  • ????...??

  • 5.總結

    從演講的例子來看,Volley應該是簡化了網絡通信的一些開發(fā),特別是針對如下兩種情況:

    • JSON對象
    • 圖片加載

    但是這個東西也有不實用的地方,比如大數據(large payloads ),流媒體,這些case,還需要使用原始的方法,比如Download Manager等。
    總之,如果你要編寫網絡程序,是不是可以考慮開始使用Volley呢?

    Google IO2013網絡框架Volley 演講PDF下載:?http://download.csdn.net/detail/t12x3456/5686041

    總結

    以上是生活随笔為你收集整理的android 网络通信框架volly的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲国产精品久久久久爰色欲 | 国产精品1024| 免费看黄色网址 | 亚洲丝袜视频 | 国产精品欧美激情 | 影音先锋亚洲成aⅴ人在 | 黄色a网| 99久久久国产精品免费蜜臀 | 风间由美一区 | 精品人妻码一区二区三区红楼视频 | 秋霞午夜 | 国产欧美一区二区三区在线看蜜臂 | 超碰蜜桃| 一区三区在线 | 91香蕉久久 | αv在线| 动漫av在线 | 潘金莲三级80分钟 | 香蕉一区二区三区四区 | 少妇精品导航 | 国产在线喷水 | 免费视频亚洲 | 亚洲a毛片 | 免费视频毛片 | 老牛影视av牛牛影视av | 欧美bbbbb| 亚洲另类网站 | 男人撒尿视频xvideos | 香蕉网站视频 | 久久久久噜噜噜亚洲熟女综合 | 久热精品视频 | 日韩精品字幕 | 欧美韩一区 | 91羞羞网站 | 国产又粗又猛又爽又黄91精品 | 夜夜嗨aⅴ一区二区三区 | 中文字幕av在线免费 | 动漫裸体无遮挡 | 国内自拍青青草 | 欧美日本成人 | 麻豆一区二区在线观看 | 欧美影院久久 | 国产性猛交xxxx免费看久久 | 国产 日韩 欧美 综合 | 午夜不卡久久精品无码免费 | 久久视频这里只有精品 | 无码国产69精品久久久久网站 | 国产午夜精品久久久久久久久久 | 午夜精品久久久久久久久久 | 一节黄色片 | 超碰碰碰 | 亚洲欧美综合网 | 奇米影视第四色888 免费观看a毛片 | 欧美狠狠| 亚洲男人的天堂网 | 99久久婷婷国产综合精品青牛牛 | 国产老女人乱淫免费 | 有色影院 | 先锋资源一区二区 | 中文字幕一区二区三区人妻在线视频 | 色婷婷导航 | 一区二区三区在线 | 久久阁| 一级特黄特色的免费大片视频 | 精品福利片 | 国产精品分类 | 91成人福利 | www黄色av| 天堂色av | 国内自拍在线 | 色www亚洲国产张柏芝 | 欧美爱爱网址 | 动漫大乳美女 | 亚洲一区二区三区欧美 | 日本成人福利视频 | 99热超碰 | 精品美女一区二区三区 | 奇米网狠狠干 | 免费看片视频 | 免费高清黄色 | 天天干天天搞天天射 | 麻豆久久久久久 | 国产黄色精品网站 | 亚洲欧美乱日韩乱国产 | 亚洲免费一级片 | 亚洲爽爽| 实拍女处破www免费看 | 69日本xxxxxxxxx30 在线波多野结衣 | 色哟哟欧美精品 | 强开乳罩摸双乳吃奶羞羞www | 国产精品一区二区三区四区视频 | 国产区网址 | 国产午夜在线视频 | 五月依人网| 欧美大浪妇猛交饥渴大叫 | 中文字幕一区二区三区四区五区 | 波多野吉衣av在线 | 国产三级三级三级 | 一区二区三区网站 |