Volley 實例DEMO

Volley 是 Google 推出的 Android 異步網絡請求框架和圖片加載框架。在 Google I/O 2013 大會上發佈。

Volley的優勢是:特別適合數據量小,通信頻繁的網絡操作。

Volley的主要特點是:

1.擴展性強。Volley 中大多是基於接口的設計,可配置性強。

2.一定程度符合 Http 規範,包括返回 ResponseCode(2xx、3xx、4xx、5xx)的處理,請求頭的處理,緩存機制的支持等。並支持重試及優先級定義。

3.默認 Android2.3 及以上基於 HttpURLConnection,2.3 以下基於 HttpClient 實現。

4.提供簡便的圖片加載工具。

HTTP協議狀態碼錶示的意思主要分爲五類 ,大體是 :  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
1××
   保留   
2××
   表示請求成功地接收   
3××
   爲完成請求客戶需進一步細化請求   
4××
   客戶錯誤   
5××
   服務器錯誤 

Volley中會常常提到response 304,意思是,Not Modified 客戶端有緩衝的文檔併發出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務器告訴客戶,原來緩衝的文檔還可以繼續使用。 

我會再寫一篇博客來總結最近學的關於volley的知識點,這篇博客主要是介紹volley的使用方法。

該代碼分別實現了Volley中常用的StringRequest的get/post方法,JsonObject的get/post方法以及對圖片的網絡加載,包括ImageRequest,ImageLoader和NetworkImageView。

其中ImageRequest需要使用queue的add函數,將request加入其中。

ImageLoader和NetworkImageView則是需要使用ImageLoader,並實現一個類來繼承ImageLoader.ImageCache。

完整代碼實現:https://github.com/xiammu/VolleyTest


package com.example.simmucheng.volleytest;

import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.StringRequest;

import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    private ImageView image;
    private NetworkImageView networkImageView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        InitView();
//        volleyGet_RequestString();
//        volleyPost_RequestString();
//        volleyGet_JsonObject();
//        volleyPost_JsonObject();
//        volley_ImageRequest();
//        volley_ImageLoader();
        volley_NetworkImageView();
//        volleyImg();

    }

    private void volley_NetworkImageView() {
        String url="http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg";
        ImageLoader loader=new ImageLoader(MyQueue.getHttpQueues(), new ImageCacheTest());
        networkImageView.setDefaultImageResId(R.drawable.ic_launcher);
        networkImageView.setErrorImageResId(R.drawable.ic_launcher);
        networkImageView.setImageUrl(url,loader);
    }

    private void InitView() {
        image= (ImageView) findViewById(R.id.image);
        networkImageView= (NetworkImageView) findViewById(R.id.network_imageview);
    }

    private void volley_ImageRequest() {
        String url="http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg";
        ImageRequest imgrequest=new ImageRequest(url, new Response.Listener<Bitmap>() {
            @Override
            public void onResponse(Bitmap bitmap) {
                image.setImageBitmap(bitmap);
            }
            //0,0表示不進行壓縮,Config.RGB_565表示每個像素佔2個字節,Config.ARGB_8888表示每個像素佔4個字節等。
            //第三第四個參數(maxWidth,maxHeight)指定允許圖片最大的寬度和高度,如果指定的網絡圖片的寬度或高度大於這裏的最大值
            // ,則會對圖片進行壓縮,指定爲0即表示不管圖片多大都不壓縮。

        }, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                image.setImageResource(R.drawable.ic_launcher);
            }
        });
        MyQueue.getHttpQueues().add(imgrequest);
    }

    private void volley_ImageLoader() {
        String url="http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg";
        //ImageCacheTest需要實現ImageCache引用,並實現其中的兩個方法
        //ImageCache是內存緩存對象,也叫L1緩存,L2緩存是磁盤緩存,內存緩存就是將展示過的圖片放入內存進行緩存,
        // 磁盤緩存就是在沒有網絡的時候調出來使用
        ImageLoader loader=new ImageLoader(MyQueue.getHttpQueues(),new ImageCacheTest());
        //三個參數分別爲控件的id,默認的圖片,發生錯誤時展示的圖片
        ImageLoader.ImageListener listener=ImageLoader.getImageListener(image,R.drawable.ic_launcher,R.drawable.ic_launcher);
        loader.get(url,listener);
    }

    private void volleyGet_JsonObject() {
        String url="http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.4.255.255";
        JsonObjectRequest jsrequest=new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                Toast.makeText(MainActivity.this,jsonObject.toString(),Toast.LENGTH_SHORT).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_SHORT).show();
            }
        });
        jsrequest.setTag("TestTag");
        MyQueue.getHttpQueues().add(jsrequest);
    }

    private void volleyPost_JsonObject() {
        String url="http://apis.juhe.cn/mobile/get?";
        Map<String,String>map=new HashMap<>();
        map.put("phone","13429667914");
        map.put("key", "335adcc4e891ba4e4be6d7534fd54c5d");
        JSONObject jsobject=new JSONObject(map);
        JsonObjectRequest jsrequest=new JsonObjectRequest(Request.Method.POST, url, jsobject, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject jsonObject) {
                Toast.makeText(MainActivity.this, jsonObject.toString(), Toast.LENGTH_SHORT).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_SHORT).show();
            }
        });
        jsrequest.setTag("TestTag");//設置tag
        MyQueue.getHttpQueues().add(jsrequest);
    }

    private void volleyPost_RequestString() {
        String url1="https://tcc.taobao.com/cc/json/mobile_tel_segment.htm";
        StringRequest request=new StringRequest(Request.Method.POST, url1, new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_SHORT).show();
            }
        }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String,String>map=new HashMap<String, String>();
                map.put("tel","15850781443");
                return map;
            }
        };
        request.setTag("TestTag");
        MyQueue.getHttpQueues().add(request);
    }

    private void volleyImg() {
    }

    private void volleyGet_RequestString() {
        String url="https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443";
        StringRequest request=new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_SHORT).show();
            }
        });
        request.setTag("TestTag");
        MyQueue.getHttpQueues().add(request);
    }

    @Override
    protected void onStop() {
        super.onStop();
        MyQueue.getHttpQueues().cancelAll("TestTag");//刪除特定的tag的request
    }
}



發佈了144 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章