跟随郭霖学Volley

volley

下载导入volleyjar

学习地址: https://blog.csdn.net/guolin_blog/article/details/17482095

2013在Google I/O大会提出

github地址: https://github.com/google/volley

下载volley导入到as

具体的操作是: project模式下 具体看图:

之后的操作是打开lib 选择jar 右击:

add as libiray

其他方式导入的,看以前的博客记录.

三部曲

创建RequestQueue

创建方法有三种,后面说,我们看简答使用.

第二部: new StringRequest(参数1,2,3);

as的直接使用ctrl p查看需要的参数,我们先不管 int method;

我们使用的参数分别是: 目标地址 成功的response的回调和失败的回调.

我们使用的如下:

// 第二部创建一个request
StringRequest StringRequest = new StringRequest(“http://www.baidu.com”, new Response.Listener() {
@Override
public void onResponse(String s) {
// 日志打印
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
//日志打印
}
});

注意的是: StringRequest是volley包里面的,内部继承的Request类;

第三部,将创建的 StringRequest添加到RequestQueue里面.

 mRequestQueue.add(StringRequest);

开始运行,查看log

我们看看log; 此时的操作是 需要url的http后面添加s;

https://www.baidu.com

再次运行就ok了,

StringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener);

StringRequest还有提供四个参数的方法,来指定请求的类型.

具体如下:

super.getParams()指向的是Request的getParams方法

最后的结果是:

 //参数的 stringRequest
    StringRequest stringRequest1 = new StringRequest(Request.Method.POST,"url地址",
            new Response.Listener<String>() {
        @Override
        public void onResponse(String s) {

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {

        }
    }){
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {

            Map<String,String> maps= new HashMap<String, String>();
            maps.put("key","value");
            //  放置需要的参数
             return maps;
        }
    };

学习使用 JsonRequest

直接复制郭霖的文字:

JsonRequest也是继承自Request类的,不过由于JsonRequest是一个抽象类,因此我们无法直接创建它的实例,那么只能从它的子类入手了。JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest,从名字上你应该能就看出它们的区别了吧?一个是用于请求一段JSON数据的,一个是用于请求一段JSON数组的。

访问的地址: http://www.weather.com.cn/weather1d/101010100.shtml

郭霖的地址使用不了.我们使用下面的地址来替换.http://www.weather.com.cn/data/sk/101010100.html

最后使用的url: http://www.weather.com.cn/data/sk/101010100.html

JsonObjectRequest jsonObjectRequest =
            new JsonObjectRequest("http://www.weather.com.cn/data/sk/101010100.html", null,
                    new Response.Listener<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject jsonObject) {
                            Log.d("天气response", jsonObject.toString());
                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {
                    Log.e("天气返回",
                            volleyError.getMessage(), volleyError);
                }
            });
    mRequestQueue.add(jsonObjectRequest);

打印日志如下:

使用ImageRequest

代码:

`//  使用 ImageRequest
    ImageRequest imageRequest = new ImageRequest(
            "https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg"
            , new Response.Listener<Bitmap>() {
        @Override
        public void onResponse(Bitmap bitmap) {
            mVolley_im.setImageBitmap(bitmap);
        }
    }, 0, 0, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            // 失败设置展示默认的图片
        }
    });

    //添加
    mRequestQueue.add(imageRequest);`

注意获取imageview控件哦.

参数的说明:

直接复制吧:

ImageRequest的构造函数接收六个参数,第一个参数就是图片的URL地址,这个没什么需要解释的。第二个参数是图片请求成功的回调,这里我们把返回的Bitmap参数设置到ImageView中。第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。第六个参数是图片请求失败的回调,这里我们当请求失败时在ImageView中显示一张默认图片

使用imageloader和imagerequest来实现图片加载

直接代码说明:

	/*使用ImageLoad
    步骤如下1. 创建一个RequestQueue对象。  我们已经创建完成

        2. 创建一个ImageLoader对象。

        3. 获取一个ImageListener对象。

        4. 调用ImageLoader的get()方法加载网络上的图片。*/
    //创建ImageLoader参数: RequestQueue 和ImageCache 后续使用Bitmapcache替换

    /*ImageLoader imageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() {
        @Override
        public Bitmap getBitmap(String s) {
            return null;
        }

        @Override
        public void putBitmap(String s, Bitmap bitmap) {

        }
    });*/
    //上面的代码可以使用下面代码替换,BitmapChae实现ImageCache,做了图片缓存使用LruCache
    ImageLoader imageLoader=  new ImageLoader(mRequestQueue,new BitmapCache());
    // 使用ImageLoader来获取一个ImageListener  第一参数控件 默认图片和 错误的时候设置的图片
    ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(mVolley_im,
            R.mipmap.ic_launcher, R.mipmap.ic_launcher);

    mUrl = "https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg";
    imageLoader.get(mUrl
            ,imageListener);
    imageLoader.get(mUrl,imageListener,200,200);

附上BitmapCache的完整代码:

import android.graphics.Bitmap;
import android.util.LruCache;
import com.android.volley.toolbox.ImageLoader;
public class BitmapCache implements ImageLoader.ImageCache {
private final int maxSize = 10 * 1024 * 1024;
private final LruCache<String, Bitmap> mLruCache;
public BitmapCache() {
    mLruCache = new LruCache<String, Bitmap>(maxSize) {
        @Override
        protected int sizeOf(String key, Bitmap value) {
            return value.getRowBytes() * value.getHeight();
        }
    };
}
@Override
public Bitmap getBitmap(String s) {
    return mLruCache.get(s);
}
@Override
public void putBitmap(String s, Bitmap bitmap) {
    mLruCache.put(s, bitmap);
}

}

NetworkImageView

Volley还提供了第三种方式来加载网络图片;

  1. 创建一个RequestQueue对象。

  2. 创建一个ImageLoader对象。

  3. 在布局文件中添加一个NetworkImageView控件。

  4. 在代码中获取该控件的实例。

  5. 设置要加载的图片地址。

代码实现:

	` /*networkImageview的实现*/
    mImageLoader1 = new ImageLoader(mRequestQueue, new BitmapCache());
    mvolley_network_im.setImageUrl(mUrl,mImageLoader1);
    mvolley_network_im.setDefaultImageResId(R.mipmap.ic_launcher);
    mvolley_network_im.setErrorImageResId(R.drawable.img_btn_add);`

XmlRequest实现

地址: http://flash.weather.com.cn/wmaps/xml/china.xml

代码实现:

  // 解析xml
    String xmlurl="http://flash.weather.com.cn/wmaps/xml/china.xml";

    XmlRequest xmlRequest = new XmlRequest(xmlurl, 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 volleyError) {
            Log.e("xmlrequest错误", volleyError.getMessage(), volleyError);
        }
    });
    mRequestQueue.add(xmlRequest);

xmlRequest如下:

public class XmlRequest extends Request<XmlPullParser> {

private final Response.Listener<XmlPullParser> mListener;

public XmlRequest(int method, String url, Response.Listener<XmlPullParser> listener,
                  Response.ErrorListener errorListener) {
    super(method, url, errorListener);
    mListener = listener;
}

public XmlRequest(String url, Response.Listener<XmlPullParser> listener, Response.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);
}
}

GsonRequest

直接代码吧!里面有详细的说明,我们依赖直接as依赖,不在下载jar包,创建类,我们直接使用快捷键来生成,gsonformat alt+insert

不在使用文章中的weather,直接使用生成的gsonbean来替换哈!

GsonRequest 的创建和实现:

public class GsonRequest<T> extends Request<T> {
// 创建一个listener
private Response.Listener mListener;
private Class<T> mClazz;
private Gson mGson;

public GsonRequest(String url, Class<T> clazz, Response.Listener<T>listener,Response.ErrorListener errlistener) {
    this(Method.GET,url,clazz,listener,errlistener);
}

public GsonRequest(int method, String url, Class<T> clazz, Response.Listener<T>listener,Response.ErrorListener errlistener) {
    super(method, url, errlistener);
    /*为啥在这里里面创建
    *
    * 默认的是get也会走这个构造方法, 注意this 和这里面的super,最后的url和method等都传给Request了.
    * */
    // 创建gson
    mGson = new Gson();
    // 成员变量 保存成功的listener和clazz
    mListener=listener;
    mClazz=clazz;
}

@Override
protected Response<T> parseNetworkResponse(NetworkResponse networkResponse) {
    // 进行解析
    try {
        String s = new String(networkResponse.data,
                HttpHeaderParser.parseCharset(networkResponse.headers));
        return Response.success(mGson.fromJson(s,mClazz),
                HttpHeaderParser.parseCacheHeaders(networkResponse));
    } catch (UnsupportedEncodingException e) {
       return Response.error(new ParseError(e));
    }

}

@Override
protected void deliverResponse(T t) {
    mListener.onResponse(t);

}
}

weatherinfo,直接自己生成吧!根据json字符串,url地址: http://www.weather.com.cn/data/sk/101010100.html

 /*gsonRequest的使用
    * 第一步: 依赖gson   我们直接as导入  github地址: https://github.com/google/gson
    * implementation 'com.google.code.gson:gson:2.8.5'
    *
    * 第二部:实现一个GsonRequest 继承 Request
    *
    * 创建gson创建weatherInfo
    *
    * 创建GsonRequest
    * 添加到Request中
    * * */
  String  gsonURL ="http://www.weather.com.cn/data/sk/101010100.html";
    GsonRequest<WeatherInfo> weatherInfoGsonRequest = new GsonRequest<>(gsonURL, WeatherInfo.class, new Response.Listener<WeatherInfo>() {
        @Override
        public void onResponse(WeatherInfo weatherInfo) {
            String city = weatherInfo.getWeatherinfo().getCity();
            String temp = weatherInfo.getWeatherinfo().getTemp();
            String time = weatherInfo.getWeatherinfo().getTime();
            Log.d("gson天气查询", city + "temp==>" + temp + "time==>" + time);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {

            Log.d("gson天气查询", volleyError.getMessage(), volleyError);
        }
    });
mRequestQueue.add(weatherInfoGsonRequest);

别忘记添加到RequestQueue中.

打印日志:

我们从打印日志看到一个是乱码一个好着呢,这个解决方法就是在我们创建的GsonRequest里面

我们查看源码可知:

日志打印:

看到问题所在没有,最后在new String的时候设置了编码格式,我们不用了,直接修改为"utf-8"

修改展示:

volley的使用就算完成了,跟随郭霖的volley学习前三篇都做完了!,之后就是volley的源码分析,单独写写一篇 .

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值