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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

开源框架Volley的使用《一》

發布時間:2024/3/13 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开源框架Volley的使用《一》 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載本專欄每一篇博客請注明轉載出處地址,尊重原創。此博客轉載鏈接地址:小楊的博客 http://blog.csdn.net/qq_32059827/article/details/52785378

本篇對一個開源框架Volley的使用做一個匯總。概述如下:

Volley

  • 回憶xutils:快速開發型框架,DbUtils(orm),ViewUtils(ioc),HttpUtils,BitmapUtils
  • 其他的快速開發型框架:andBase,thinkandroid,loonandroid,dhroid
  • orm:對象關系型映射
    • db:create table ttable(id integer primary key autoincret...);
    • insert-->save(obj)
  • ioc:控制反轉
    • Obj obj = new Obj();
    • 對象的實例化,不用new關鍵字就可以了吧.
  • 為什么要講volley?
    • 因為它是google出的,google 在2013 i/o大會上提出來的.
    • 而且在幾個項目里面已經看到了它的身影
  • google公司為什么會去搞一個volley框架?
    • 1. 用戶開啟一個activity,然后加載網絡,這個時候.如果用戶點擊了finish按鈕.activity被銷毀了-->網絡請求和activity的生命周期是應該聯動起來的.
    • 2. listview加載圖片的情況比較多.如果用戶快速的去滑動listview-->getView->快速的加載圖片,用戶停止操作的時候.其實真正現實的圖片最多就幾張--->圖片應該緩存起來(內存 +本地 )
    • 3. 如果用戶打開了一個activity,用戶旋轉了一下屏幕.activity會旋轉-->生命周期重走了-->網絡請求緩存
    • 4. 之前我們的網絡請求,httpurlconnection,httpclient,asynctask(api)-->android sdk-->封裝性不夠好.1000個開發者就有1000種使用方式-->不夠統一
    • 5. 理念很容易理解,是開源的.
  • volley是啥?
    • 是一種通信框架,和xutils中的HttpUtils,BitmapUtils

Volley兩個核心類

  • RequestQueue?用來執行請求的請求隊列
  • Request?用來構造一個請求對象
  • Request對象主要有以下幾種類型:?
  • StringRequest?響應的主體為字符串
  • JsonArrayRequest?發送和接收JSON數組
  • JsonObjectRequest?發送和接收JSON對象
  • ImageRequest?發送和接收Image

  • Request:一個請求
    • StringRequest:請求的時候直接回來一個String
    • JsonObjectRequest:請求的時候直接回來一個JsonObject
    • JsonArrayRequest:請求的時候直接回來一個JsonArray
    • ImageRequest:請求的時候直接回來一個Bitmap
    • 自定義請求:一會我們會結合gson
  • ImageLoader:圖片的加載器
  • NetWorkImageView:繼承了imageView,對ImageView進行了拓展
  • RequestQueue:請求隊列

Volley到底有哪些特點呢?

  • 自動調度網絡請求
  • 多個并發的網絡連接
  • 通過使用標準的HTTP緩存機制保持磁盤和內存響應的一致
  • 支持請求優先級
  • 支持取消請求的強大API,可以取消單個請求或多個
  • 易于定制
  • 健壯性:便于正確的更新UI和獲取數據
  • 包含調試和追蹤工具


  • 接下來就一一對其使用方式做一個匯總。

    1、StringRequest的使用,代碼如下:

    package com.example.volleydemo;import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.Response.Listener; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initStringRequest();}/*** StringRequest使用*/private void initStringRequest() {Button btn1 = (Button) findViewById(R.id.btn1);btn1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//1、創建StringRequest對象String url = "http://www.baidu.com";StringRequest stringRequest = new StringRequest(url , new Listener<String>() {@Overridepublic void onResponse(String response) {// 請求成功回調System.out.println("success---->>"+response);}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {// 失敗回調System.out.println("error---->>"+error);}});//2、創建requestQueueRequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);//3、發起網絡請求----》把reuest防盜requestqueue中requestQueue.add(stringRequest);}});} }
    其實和httputils差不多。

    2、JsonObjectRwquest的使用

    請求服務器。直接返回一個數據的jsonObject對象

    /*** JsonObjectRequest的使用*/private void initJsonObjectRequest() {findViewById(R.id.btn2).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//1、創建JsonObjectRequest對象String url = "http://192.168.1.100:8080/getviruses.json";JSONObject jsonRequest = null;//表示post請求,直接post一個jsonobjectJsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url , jsonRequest , new Listener<JSONObject>() {@Overridepublic void onResponse(JSONObject response) {//從jsonobject獲取數據String desc = response.optString("md5");//不需要捕獲異常的apiSystem.out.println("success---->>"+desc);}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {System.out.println(error);}});//2、創建requestQueueRequestQueue queue = Volley.newRequestQueue(MainActivity.this);//3、發起網絡請求----》把reuest放到requestqueue中queue.add(jsonObjectRequest);}});}其中有一個小知識點,很少知道:即:response.optString("origin");

    JsonObject取值

    • String origin = response.getString("origin");// 方式一
      • 這個如果沒有對應的key會拋異常.需要異常處理
    • String origin = response.optString("origin");// 方式二
      • 這個如果沒有對應的key不會拋異常.會返回一個默認值
      • optString:默認值""
      • optInt:默認值 0
      • 比如有的實體bean屬性很多.我們不喜歡去建議對應的XXX.class的時候.可以使用JsonObject里面的這個方法

    3、JsonArrayRequest的使用

    請求服務器。直接返回一個數據的jsonArrayt對象。和2非常接近。只不過是把Object換成Array。稍作修改罷了。

    4、ImageRequest的使用

    /*** ImageRequest的使用*/private void initImageRequest() {findViewById(R.id.btn3).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {String url = "http://192.168.1.100:8080/meinv.jpg";ImageRequest imageRequest = new ImageRequest(url , new Listener<Bitmap>() {@Overridepublic void onResponse(Bitmap response) {iv.setImageBitmap(response);}}, 0, 0, Bitmap.Config.ARGB_4444, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {}});//2、創建requestQueueRequestQueue queue = Volley.newRequestQueue(MainActivity.this);//3、發起網絡請求----》把reuest放到requestqueue中queue.add(imageRequest);}});}
    到這里,可能就要詳細說明上邊代碼意義了。加載圖片,不想前面三種簡單,這里還是有許多學問的。那么,就從源碼的角度,從0開始來分析這里的原理。

    4.1 使用步驟

    ImageRequest仍舊是一個request對象,所以使用方式和StringRequest、JsonObjectRequest、JsonArrayRequest十分相似。

    步驟:

  • 建立一個RequestQueue對象
  • 建立一個ImageRequest對象
  • 將ImageRequest添加到RequestQueue中
  • 第一步、第三步我們在上篇文章中已經做好了,如果不清楚的話可以去上一篇文章查看。

    ?

    4.2 分析構造函數

    源碼中的構造函數是這樣定義的:

    public ImageRequest(String url, Response.Listener<Bitmap> listener, int maxWidth, int maxHeight,Config decodeConfig, Response.ErrorListener errorListener) {super(Method.GET, url, errorListener);setRetryPolicy(new DefaultRetryPolicy(IMAGE_TIMEOUT_MS, IMAGE_MAX_RETRIES, IMAGE_BACKOFF_MULT));mListener = listener;mDecodeConfig = decodeConfig;mMaxWidth = maxWidth;mMaxHeight = maxHeight;}

    默認的請求方式是GET,初始化方法需要傳入:圖片的url,一個響應結果監聽器,圖片的最大寬度,圖片的最大高度,圖片的顏色屬性,出錯響應的監聽器。

    說明:圖片的顏色屬性,Bitmap.Config下的幾個常量都可以在這里使用,其中ARGB_8888可以展示最好的顏色屬性,每個圖片像素占據4個字節的大小,而RGB_565則表示每個圖片像素占據2個字節大小


    /** Socket timeout in milliseconds for image requests */private static final int IMAGE_TIMEOUT_MS = 1000;/** Default number of retries for image requests */private static final int IMAGE_MAX_RETRIES = 2;/** Default backoff multiplier for image requests */private static final float IMAGE_BACKOFF_MULT = 2f;
    • 設定超時時間:1000ms;
    • 最大的請求次數:2次;
    • 發生沖突時的重傳延遲增加數:2f(這個應該和TCP協議有關,沖突時需要退避一段時間,然后再次請求);

    4.3 解釋maxWidth,maxHeight參數

    注釋中詳細說明了圖片寬高的意義和作用,為了便于理解我再詳細說一下。

    先來完整解釋下注釋的意思:

    • 建立一個請求對象,按照最大寬高進行解碼 。
    • 如果設定的寬和高都是0,那么下載到的圖片將會按照實際的大小進行解碼,也就是不壓縮。
    • 如果寬和高中的一個或兩個值不為0,那么圖片的寬/高(取決于你設定了寬還是高)會壓縮至設定好的值,而另一個寬/高將會按原始比例改變。
    • 如果寬和高都不是0,那么得到的圖片將會“按比例”解碼到你設定的寬高,也就是說最終得到的圖片大小不一定是你最初設定的大小。

    舉個例子:

    我的圖片原本像素是:850x1200.

    maxWidth = 0,maxHeight = 0時,最終得到的bitmap的寬高是850x1200

    當maxWidth = 0,maxHeight = 600時,得到的bitmap是425x600.這就說明它會按照一個不為0的邊的值,將圖片進行等比縮放。

    當maxWidth = 100,maxHeight = 600時,我們得到的bitmap竟然是100x141,是按照100進行等比縮小后的圖片,而不是100x600.

    這是因為源碼中,當寬高分別縮放后,會按照縮放比例大的哪個比例去縮放。就是上邊第三種情況:寬縮小8.5倍,高也按照這個比例去縮放。


    總結

    以上是生活随笔為你收集整理的开源框架Volley的使用《一》的全部內容,希望文章能夠幫你解決所遇到的問題。

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