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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

开源框架Volley的使用《一》

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

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

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

Volley

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

Volley兩個核心類

  • RequestQueue?用來執(zhí)行請求的請求隊列
  • Request?用來構(gòu)造一個請求對象
  • Request對象主要有以下幾種類型:?
  • StringRequest?響應(yīng)的主體為字符串
  • JsonArrayRequest?發(fā)送和接收J(rèn)SON數(shù)組
  • JsonObjectRequest?發(fā)送和接收J(rèn)SON對象
  • ImageRequest?發(fā)送和接收Image

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

Volley到底有哪些特點(diǎn)呢?

  • 自動調(diào)度網(wǎng)絡(luò)請求
  • 多個并發(fā)的網(wǎng)絡(luò)連接
  • 通過使用標(biāo)準(zhǔn)的HTTP緩存機(jī)制保持磁盤和內(nèi)存響應(yīng)的一致
  • 支持請求優(yōu)先級
  • 支持取消請求的強(qiáng)大API,可以取消單個請求或多個
  • 易于定制
  • 健壯性:便于正確的更新UI和獲取數(shù)據(jù)
  • 包含調(diào)試和追蹤工具


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

    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、創(chuàng)建StringRequest對象String url = "http://www.baidu.com";StringRequest stringRequest = new StringRequest(url , new Listener<String>() {@Overridepublic void onResponse(String response) {// 請求成功回調(diào)System.out.println("success---->>"+response);}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {// 失敗回調(diào)System.out.println("error---->>"+error);}});//2、創(chuàng)建requestQueueRequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);//3、發(fā)起網(wǎng)絡(luò)請求----》把reuest防盜requestqueue中requestQueue.add(stringRequest);}});} }
    其實(shí)和httputils差不多。

    2、JsonObjectRwquest的使用

    請求服務(wù)器。直接返回一個數(shù)據(jù)的jsonObject對象

    /*** JsonObjectRequest的使用*/private void initJsonObjectRequest() {findViewById(R.id.btn2).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//1、創(chuàng)建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獲取數(shù)據(jù)String desc = response.optString("md5");//不需要捕獲異常的apiSystem.out.println("success---->>"+desc);}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {System.out.println(error);}});//2、創(chuàng)建requestQueueRequestQueue queue = Volley.newRequestQueue(MainActivity.this);//3、發(fā)起網(wǎng)絡(luò)請求----》把reuest放到requestqueue中queue.add(jsonObjectRequest);}});}其中有一個小知識點(diǎn),很少知道:即:response.optString("origin");

    JsonObject取值

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

    3、JsonArrayRequest的使用

    請求服務(wù)器。直接返回一個數(shù)據(jù)的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、創(chuàng)建requestQueueRequestQueue queue = Volley.newRequestQueue(MainActivity.this);//3、發(fā)起網(wǎng)絡(luò)請求----》把reuest放到requestqueue中queue.add(imageRequest);}});}
    到這里,可能就要詳細(xì)說明上邊代碼意義了。加載圖片,不想前面三種簡單,這里還是有許多學(xué)問的。那么,就從源碼的角度,從0開始來分析這里的原理。

    4.1 使用步驟

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

    步驟:

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

    ?

    4.2 分析構(gòu)造函數(shù)

    源碼中的構(gòu)造函數(shù)是這樣定義的:

    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;}

    默認(rèn)的請求方式是GET,初始化方法需要傳入:圖片的url,一個響應(yīng)結(jié)果監(jiān)聽器,圖片的最大寬度,圖片的最大高度,圖片的顏色屬性,出錯響應(yīng)的監(jiān)聽器。

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


    /** 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;
    • 設(shè)定超時時間:1000ms;
    • 最大的請求次數(shù):2次;
    • 發(fā)生沖突時的重傳延遲增加數(shù):2f(這個應(yīng)該和TCP協(xié)議有關(guān),沖突時需要退避一段時間,然后再次請求);

    4.3 解釋maxWidth,maxHeight參數(shù)

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

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

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

    舉個例子:

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

    當(dāng)maxWidth = 0,maxHeight = 0時,最終得到的bitmap的寬高是850x1200

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

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

    這是因?yàn)樵创a中,當(dāng)寬高分別縮放后,會按照縮放比例大的哪個比例去縮放。就是上邊第三種情況:寬縮小8.5倍,高也按照這個比例去縮放。


    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。