欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

AndroidVolley網(wǎng)絡通訊框架(Google) - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設/小程序開發(fā)/軟件開發(fā)

知識

不管是網(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
  1. 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
  1. mQueue = Volley.newRequestQueue(getApplicationContext());  
  2. mQueue.add(new JsonObjectRequest(Method.GET, url, null,  
  3.             new Listener() {  
  4.                 @Override  
  5.                 public void onResponse(JSONObject response) {  
  6.                     Log.d(TAG, "response : " + response.toString());  
  7.                 }  
  8.             }, null));  
  9. 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
  1. // imageView是一個ImageView實例  
  2. // ImageLoader.getImageListener的第二個參數(shù)是默認的圖片resource id  
  3. // 第三個參數(shù)是請求掉敗時刻的資本id,可以指定為0  
  4. ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate, android.R.drawable.ic_delete);  
  5. 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
  1. 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
  1. mImageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache());  
  2. ... ...  
  3.    
  4. if(holder.imageRequest != null) {  
  5.     holder.imageRequest.cancel();  
  6. }  
  7. 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
  1. 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
  1. /** 
  2.  * Simple cache adapter interface. If provided to the ImageLoader, it 
  3.  * will be used as an L1 cache before dispatch to Volley. Implementations 
  4.  * must not block. Implementation with an LruCache is recommended. 
  5.  */  
  6. public interface ImageCache {  
  7.     public Bitmap getBitmap(String url);  
  8.     public void putBitmap(String url, Bitmap bitmap);  
  9. }  

下面的網(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
  1. @Override  
  2. protected Response parseNetworkResponse(NetworkResponse response) {  
  3.     try {  
  4.         String json = new String(  
  5.                 response.data, HttpHeaderParser.parseCharset(response.headers));  
  6.         return Response.success(  
  7.                 gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response));  
  8.     } catch (UnsupportedEncodingException e) {  
  9.         return Response.error(new ParseError(e));  
  10.     } catch (JsonSyntaxException e) {  
  11.         return Response.error(new ParseError(e));  
  12.     }  
  13. }  

這段代碼節(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
  1. mRequestQueue.add( new GsonRequest(url, ListResponse.class, null,  
  2.     new Listener() {  
  3.         public void onResponse(ListResponse response) {  
  4.             appendItemsToList(response.item);  
  5.             notifyDataSetChanged();  
  6.         }  
  7.     }  
  8. }  

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
  1. @Override public void onPostExecute(Result r) {  
  2.     if (getActivity() == null) {  
  3.         return;  
  4.     }  
  5.     // ...  
  6. }  

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
  1. @Override  
  2. public void onStop() {  
  3.     for (Request <?> req : mInFlightRequests) {  
  4.         req.cancel();  
  5.     }  
  6.     ...  
  7. }  

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

[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
  1. @Override pubic void onStop() {  
  2.     mRequestQueue.cancelAll(this);  
  3.     ...  
  4. }  

也可以根據(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
  1. @Override public void onStop() {  
  2.     mRequestQueue.cancelAll( new RequestFilter() {})  
  3.     ...  
  4.     // or  
  5.     mRequestQueue.cancelAll(new Object());  
  6.     ...  

5.總結
大年夜演講的例子來看,Volley應當是簡化了收集通信的一些開辟,特別是針對如下兩種情況:
  • JSON對象
  • 圖片加載

然則這個器械也有不實用的處所,比如大年夜數(shù)據(jù)(large payloads ),流媒體,這些case,還須要應用原始的辦法,比如Download Manager等。
總之,如不雅你要編寫收集法度榜樣,是不是可以推敲開端應用Volley呢?
volley 文檔免費下載

相關案例查看更多