知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
AndroidVolley網(wǎng)絡通訊框架(Google)
發(fā)表時間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):37
Volley主頁 https://android.googlesource.com/platform/frameworks/volley
http://www.youtube.com/watch?v=yhv8l9F44qo&feature=player_embedded
1. 什么是Volley
在這之前,我們在法度榜樣中須要和收集通信的時刻,大年夜體應用的器械莫過于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,本年的Google I/O 2013上,Volley宣布了。Volley是Android平滔喔贍收集通信庫,能使收集通信更快,更簡單,更結實。
這是Volley名稱的由來: a burst or emission of many things or a large amount at once
在Google IO的演講上,其配圖是一幅發(fā)射火弓箭的圖,有點類似流星。見下圖
[img]http://img.blog.csdn.net/20130702124537953?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdDEyeDM0NTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
其實,大年夜這幅圖,我們也可以看出來,Volley特別合適數(shù)據(jù)量不大年夜然則通信頻繁的場景。
1.1. Volley惹人的背景
在以前,我們可能面對如下很多麻煩的問題。
比如以前大年夜網(wǎng)高低載圖片的步調(diào)可能是如許的流程:
- 在ListAdapter#getView()里開端圖像的攫取。
- 經(jīng)由過程AsyncTask等機制應用HttpURLConnection大年夜辦事器去的圖片資本
- 在AsyncTask#onPostExecute()里設置響應ImageView的屬性。
而在Volley下,只須要一個函數(shù)即可,具體見后面的例子。
再比如,屏幕扭轉的時刻,有時刻會導致再次大年夜收集取得數(shù)據(jù)。為了避免這種不須要的收集拜訪,我們可能須要本身寫很多針對各類情況的處理,比如cache什么的。
再有,比如ListView的時刻,我們滾動過快,可能導致有些收集請求返回的時刻,早已經(jīng)滾過了當時的地位,根本沒須要顯示在list里了,固然我們可以經(jīng)由過程ViewHolder來保持url等來實現(xiàn)防止兩次取得,然則那些已經(jīng)沒有必須要的數(shù)據(jù),照樣會浪費體系的各類資本。
1.2. Volley供給的功能
簡單來說,它供給了如下的便利功能:
- JSON,圖像等的異步下載;
- 收集請求的排序(scheduling)
- 收集請求的優(yōu)先級處理
- 緩存
- 多級別撤消請求
- 和Activity和生命周期的聯(lián)動(Activity停止時同時撤消所有收集請求)
2. 應用前的預備
惹人Volley異常簡單,起首,大年夜git庫先克隆一個下來:
[java] view plaincopy[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/CODE_ico.png[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/ico_fork.svg
- 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[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/CODE_ico.png[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/ico_fork.svg
- 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[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/CODE_ico.png[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/ico_fork.svg
- // imageView是一個ImageView實例
- // ImageLoader.getImageListener的第二個參數(shù)是默認的圖片resource id
- // 第三個參數(shù)是請求掉敗時刻的資本id,可以指定為0
- ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate, android.R.drawable.ic_delete);
- mImageLoader.get(url, listener);
ImageLoader的辦法都須要大年夜主線程里來調(diào)用。
3.3. 應用NetworkImageView
Volley供給了一個新的控件NetworkImageView來代替?zhèn)鹘y(tǒng)的ImageView,這個控件的圖片屬性可以經(jīng)由過程
[java] view plaincopy[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/CODE_ico.png[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/ico_fork.svg
- mImageView.setImageUrl(url, imageLoader)
來設定。并且,這個控件在被大年夜父控件detach的時刻,會主動撤消收集請求的,即完全不消我們擔心相干收集請求的生命周期問題。
示例代碼如下:
[java] view plaincopy[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/CODE_ico.png[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/ico_fork.svg
- 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[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/CODE_ico.png[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/ico_fork.svg
- mImageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache());
ImageLoader構造函數(shù)的第二個參數(shù)是一個ImageCache的實例(嚴格來說,是實現(xiàn)ImageCache接口的某具體類的實例)
ImageCache的定義如下(在ImageLoader.java里):
[java] view plaincopy[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/CODE_ico.png[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/ico_fork.svg
- /**
- * 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);
- }
下面的網(wǎng)址一個lru的cache實現(xiàn)例子,請參考:
https://github.com/suwa-yuki/VolleySample/blob/master/src/jp/classmethod/android/sample/volley/BitmapCache.java
3.5. 應用本身定制的request
我們也可以經(jīng)由過程持續(xù)Request根據(jù)本身的需求來定制本身的request
[java] view plaincopy[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/CODE_ico.png[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/ico_fork.svg
- @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[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/CODE_ico.png[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/ico_fork.svg
- 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線程可以有多個,如許能解決比并行問題。如下圖:
[img]http://img.blog.csdn.net/20130702124824156?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdDEyeDM0NTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
如不雅在一個Activity瑯綾擎啟動了收集請求,而在這個收集請求還沒返回結不雅的時刻,如不雅Activity被停止了,則我們須要寫如下代碼作為戍守:
[java] view plaincopy[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/CODE_ico.png[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/ico_fork.svg
- @Override public void onPostExecute(Result r) {
- if (getActivity() == null) {
- return;
- }
- // ...
- }
Activity被終止之后,如不雅持續(xù)應用個中的Context等,除了無辜的浪費CPU,電池,收集等資本,有可能還會導致法度榜樣crash,所以,我們須要處理這種一場情況。
應用Volley的話,我們可以在Activity停止的時刻,同時撤消所有或部分未完成的收集請求。
Volley里所有的請求結不雅會返回給主過程,如不雅在主過程里撤消了某些請求,則這些請求將不會被返回給主線程。
比如,可以針對某些個request做撤消操作:
[java] view plaincopy[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/CODE_ico.png[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/ico_fork.svg
- @Override
- public void onStop() {
- for (Request <?> req : mInFlightRequests) {
- req.cancel();
- }
- ...
- }
或者,撤消這個隊列里的所有請求:
[java] view plaincopy[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/CODE_ico.png[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/ico_fork.svg
- @Override pubic void onStop() {
- mRequestQueue.cancelAll(this);
- ...
- }
也可以根據(jù)RequestFilter或者Tag來終止某些請求:
[java] view plaincopy[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/CODE_ico.png[img]http://blog.csdn.net/fangchao3652/article/details/42402279/https:/code.csdn.net/assets/ico_fork.svg
- @Override public void onStop() {
- mRequestQueue.cancelAll( new RequestFilter() {})
- ...
- // or
- mRequestQueue.cancelAll(new Object());
- ...
5.總結
大年夜演講的例子來看,Volley應當是簡化了收集通信的一些開辟,特別是針對如下兩種情況:
- JSON對象
- 圖片加載
然則這個器械也有不實用的處所,比如大年夜數(shù)據(jù)(large payloads ),流媒體,這些case,還須要應用原始的辦法,比如Download Manager等。
總之,如不雅你要編寫收集法度榜樣,是不是可以推敲開端應用Volley呢?
volley 文檔免費下載
相關案例查看更多
相關閱讀
- python開發(fā)小程序
- 云南衛(wèi)視小程序
- 開發(fā)微信小程序
- APP
- 網(wǎng)站排名
- 英文網(wǎng)站建設公司
- 小程序開發(fā)平臺前十名
- 出入小程序
- 汽車回收系統(tǒng)
- 定制小程序開發(fā)
- 網(wǎng)站建設靠譜公司
- 百度快速排名
- 小程序公司
- 網(wǎng)頁制作
- 網(wǎng)站建設報價
- 二叉樹
- 高端網(wǎng)站建設公司
- 模版消息
- 云南網(wǎng)站優(yōu)化公司
- 網(wǎng)站制作
- 云南網(wǎng)站建設報價
- 紅河小程序開發(fā)
- 北京小程序制作
- 昆明做網(wǎng)站
- 昆明小程序設計
- 汽車拆解管理系統(tǒng)
- 生成海報
- 汽車報廢
- 報廢車回收管理軟件
- 網(wǎng)站建設公司地址