Volley的使用總結(jié)

Volley可以非常簡單地進(jìn)行HTTP通信,也可以加載網(wǎng)絡(luò)圖片,適用進(jìn)行數(shù)據(jù)量不大,但是通信頻繁的網(wǎng)絡(luò)操作,對于大數(shù)據(jù)量的網(wǎng)絡(luò)操作,比如說下載文件等,Volley就比較糟糕。

StringRequest的用法

//1.創(chuàng)建RequestQueue對象。
RequestQueue mQueue = Volley.newRequestQueue(context);
//RequestQueue 是一個請求隊(duì)列對象,可以緩存所有的HTTP請求,然后按照一定的算法并發(fā)地發(fā)出這些請求。內(nèi)部設(shè)計就是非常適合高并發(fā)的,基本上在每一個需要和網(wǎng)絡(luò)交互的Activity中創(chuàng)建一個RequestQueue對象就可以了。

//2.創(chuàng)建StringRequest對象
StringRequest stringRequest = new StringRequest("https://ww.baidu.com",
new Response.Listener<String>(){
    @Override
    public void onResponse(String response){
    }}, new Response.ErrorListener(){
      @Override
     public void onErrorResponse(VolleyError error){
     }
});

//3.將StringRequest對象添加到RequestQueue。
mQueue.add(stringRequest);

//POST請求方式
StringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener){
    @Override
     protected Map<String, String> getParams() throws AuthFailureError{
          Map<String, String> map = new HashMap<>();
          map.put("params1", "value1");
          map.put("params2", "value2");
          return map;
      }
};

JsonRequest的用法

有兩個子類JsonObjectRequest和JsonArrayRequest。

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("https://ww.baidu.com",null,
new Response.Listener<JSONObject>(){
    @Override
    public void onResponse(JSONObject response){
    }}, new Response.ErrorListener(){
      @Override
     public void onErrorResponse(VolleyError error){
     }
});

mQueue.add(jsonObjectRequest);

//JsonArrayRequest同理

ImageRequest的用法

ImageRequest imageRequest = new ImageRequest(
"http://developer.android.com/images/home/aw_dac.png",
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
imageView.setImageBitmap(response);
}
}, 0, 0, Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
imageView.setImageResource(R.drawable.default_image);
}
});

//其中第三第四個參數(shù),分別是指定允許圖片的最大的寬度和高度。
指定0就不管圖片多大,都不會壓縮。

ImageLoader的用法

ImageLoader明顯要比ImageRequest更加高效,它不僅幫我們對圖片進(jìn)行緩存,還過濾重復(fù)的鏈接,避免重復(fù)發(fā)送請求。
主要步驟:
1、創(chuàng)建一個RequestQueue對象
2、創(chuàng)建一個ImageLoader對象
3、獲取一個ImageListenre對象
4、調(diào)用ImageLoader的get()方法加載網(wǎng)絡(luò)上的圖片。

RequestQueue mQueue = Volley.newRequestQueue(context);

//自定義一個圖片緩存
public class BitmapCache implements ImageCache {
private LruCache<String, Bitmap> mCache;
public BitmapCache() {
int maxSize = 10 * 1024 * 1024;
mCache = new LruCache<String, Bitmap>(maxSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap);
}
}



ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());

ImageListener listener = ImageLoader.getImageListener(imageView, R,drawable.default_image, R.drawable.failed_image);

imageLoader.get("http://adbdd/adb.png", listener);
//或,指定允許的最大寬高
imageLoader.get("http://adbdd/adb.png", listener, 200,200);

NetworkImageView的用法

NetworkImageView是一個自定義控件,繼承自ImageView,具備它所有的功能,并在原生的基礎(chǔ)上加入了加載網(wǎng)絡(luò)圖片的功能。
1、創(chuàng)建一個ReqestQueue對象
2、創(chuàng)建一個ImageLoader對象
3、在布局文件中添加一個NetworkImageView控件
4、代碼中獲取該控件的實(shí)例
5、設(shè)置要加載的圖片地址

其中第一二步和上面相同。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send Request" />
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/network_image_view"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_gravity="center_horizontal"
/>
</LinearLayout>

networkImageView =findViewById(R.id.network_image_view);

networkImageView.setDefaultImageResId(R.deawable.default_image);
networkImageView.setErrorImageResId(R.drawable.failed_image);
networkImageView.setImageUrl("https://img-abv.png", imageLoader);

自定義XMLRequest

public class XMLRequest extends Request<XmlPullParser> {
private final Listener<XmlPullParser> mListener;
public XMLRequest(int method, String url, Listener<XmlPullParser> listener,
ErrorListener errorListener) {
super(method, url, errorListener);
mListener = listener;
}
public XMLRequest(String url, Listener<XmlPullParser> listener, ErrorListener errorListener) {
this(Method.GET, url, listener, errorListener);
}
@Override
protected Response<XmlPullParser> parseNetworkResponse(NetworkResponse response) {
try {
String xmlString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlString));
return Response.success(xmlPullParser, HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (XmlPullParserException e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(XmlPullParser response) {
mListener.onResponse(response);
}
}


XMLRequest xmlRequest = new XMLRequest(
"http://flash.weather.com.cn/wmaps/xml/china.xml",
new Response.Listener<XmlPullParser>() {
@Override
public void onResponse(XmlPullParser response) {
try {
int eventType = response.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG:
String nodeName = response.getName();
if ("city".equals(nodeName)) {
String pName = response.getAttributeValue(0);
Log.d("TAG", "pName is " + pName);
}
break;
}
eventType = response.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
mQueue.add(xmlRequest);

自定義GsonRequest

//把gson的jar包添加到項(xiàng)目中
public class GsonRequest<T> extends Request<T> {
private final Listener<T> mListener;
private Gson mGson;
private Class<T> mClass;
public GsonRequest(int method, String url, Class<T> clazz, Listener<T> listener,
ErrorListener errorListener) {
super(method, url, errorListener);
mGson = new Gson();
mClass = clazz;
mListener = listener;
}
public GsonRequest(String url, Class<T> clazz, Listener<T> listener,
ErrorListener errorListener) {
this(Method.GET, url, clazz, listener, errorListener);
}
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(mGson.fromJson(jsonString, mClass),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(T response) {
mListener.onResponse(response);
}
}

public class Weather {
private WeatherInfo weatherinfo;
public WeatherInfo getWeatherinfo() {
return weatherinfo;
}
public void setWeatherinfo(WeatherInfo weatherinfo) {
this.weatherinfo = weatherinfo;
}
}

public class WeatherInfo {
private String city;
private String temp;
private String time;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getTemp() {
return temp;
}
public void setTemp(String temp) {
this.temp = temp;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
}

GsonRequest<Weather> gsonRequest = new GsonRequest<Weather>(
"http://www.weather.com.cn/data/sk/101010100.html", Weather.class,
new Response.Listener<Weather>() {
@Override
public void onResponse(Weather weather) {
WeatherInfo weatherInfo = weather.getWeatherinfo();
Log.d("TAG", "city is " + weatherInfo.getCity());
Log.d("TAG", "temp is " + weatherInfo.getTemp());
Log.d("TAG", "time is " + weatherInfo.getTime());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
mQueue.add(gsonRequest);


來源:https://www.jishudog.com/22298/html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容