Volley是Google开发的一个网络库:
Volley 里面也封装了 ImageLoader ,所以如果你愿意你甚至不需要使用图片加载框架,不过这块功能没有
一些专门的图片加载框架强大,对于简单的需求可以使用,对于稍复杂点的需求还是需要用到专门的图片加载框架。
Volley 也有缺陷,比如不支持 post 大数据,所以不适合上传文件。不过 Volley 设计的初衷本身也就是为频繁的、数据量小的网络请求而生
1. 创建一个RequestQueue对象。
2. 创建一个Request对象。
3. 将Request对象添加到RequestQueue里面。
Volley 里面也封装了 ImageLoader ,所以如果你愿意你甚至不需要使用图片加载框架,不过这块功能没有
一些专门的图片加载框架强大,对于简单的需求可以使用,对于稍复杂点的需求还是需要用到专门的图片加载框架。
Volley 也有缺陷,比如不支持 post 大数据,所以不适合上传文件。不过 Volley 设计的初衷本身也就是为频繁的、数据量小的网络请求而生
1. 创建一个RequestQueue对象。
2. 创建一个Request对象。
3. 将Request对象添加到RequestQueue里面。
StringRequest:
public class MainActivity extends AppCompatActivity { private RequestQueue mRequestQueue; private StringRequest stringRequest; private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button)this.findViewById(R.id.btn); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mRequestQueue = Volley.newRequestQueue(MainActivity.this); String url = "http://api.androidhive.info/volley/string_response.html"; stringRequest =new StringRequest(Request.Method.GET,url, new Response.Listener<String>() { @Override public void onResponse(String response) { Log.d("Response:", response); } },new Response.ErrorListener(){ @Override public void onErrorResponse(VolleyError error) { Log.e("MainActivity", "onErrorMsg:",error); } }); mRequestQueue.add(stringRequest); } });
/*POST*/
// stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { // @Override // public void onResponse(String response) { // // } // }, new Response.ErrorListener() { // @Override // public void onErrorResponse(VolleyError error) { // // } // }){ // @Override // protected Map<String, String> getParams() throws AuthFailureError { // // return super.getParams(); // } // };}}
JsonRequest:
类似于StringRequest,JsonRequest也是继承自Request类的,不过由于JsonRequest是一个抽象类,因此我们无法直接创建它的实例,那么只能从它的子类入手了。JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest
button1 =(Button)this.findViewById(R.id.btn1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { /*JsonRequest*/ JsonObjectRequest objectRequest =new JsonObjectRequest(Request.Method.GET,url,new JSONObject(), new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.d(TAG, response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e(TAG, "onErrorResponse: ",error ); } }); mRequestQueue.add(objectRequest); } });
LoadImage:
Button button3 =(Button)this.findViewById(R.id.btn2); button3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { final ImageRequest imageRequest =new ImageRequest("http://avatar.csdn.net/8/B/B/1_sinyu890807.jpg", new Response.Listener<Bitmap>() { @Override public void onResponse(Bitmap response) { imageview.setImageBitmap(response); Toast.makeText(MainActivity.this,"请求成功",Toast.LENGTH_SHORT).show(); } }, 200, 200, Bitmap.Config.RGB_565, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e(TAG, "onErrorResponse: ",error ); imageview.setImageResource(R.drawable.p1); Toast.makeText(MainActivity.this,"请求失败",Toast.LENGTH_SHORT).show(); } }); mRequestQueue.add(imageRequest); } });
ImageLoader:
1. 创建一个RequestQueue对象。
2. 创建一个ImageLoader对象。
3. 获取一个ImageListener对象。
4. 调用ImageLoader的get()方法加载网络上的图片。
Button button4 =(Button)MainActivity.this.findViewById(R.id.btn3); button4.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //ImageLoader: ImageLoader imageLoader =new ImageLoader(mRequestQueue, new BitmapCatch()); //ImageLisetener: ImageLoader.ImageListener listener =imageLoader.getImageListener(imageview,R.drawable.p1,R.drawable.p2); //get: imageLoader.get("http://p3.wmpic.me/article/2014/10/09/1412837690_CDFjTPwJ.jpg",listener,200,200); } }); } //图片缓存BitmapCatch LruCache public class BitmapCatch implements ImageLoader.ImageCache { private LruCache<String,Bitmap> mCache; public BitmapCatch() { int maxSize =10 * 1024 * 1024; mCache =new LruCache<String, Bitmap>(maxSize) { @Override protected int sizeOf(String key, Bitmap value) { return value.getRowBytes() * value.getHeight(); } }; } @Override public Bitmap getBitmap(String url) { return mCache.get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { mCache.put(url,bitmap); } }
NetworkImageView:
1. 创建一个RequestQueue对象。
2. 创建一个ImageLoader对象。
3. 在布局文件中添加一个NetworkImageView控件。4. 在代码中获取该控件的实例。
5. 设置要加载的图片地址
XML:
<com.android.volley.toolbox.NetworkImageView android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/NetworkImage"/>MainActivity:
NetworkImageView netImage =(NetworkImageView)MainActivity.this.findViewById(R.id.NetworkImage); netImage.setDefaultImageResId(R.drawable.p1); netImage.setErrorImageResId(R.drawable.p2); netImage.setImageUrl("http://p3.wmpic.me/article/2014/10/09/1412837690_CDFjTPwJ.jpg",imageLoader);
自定义Request:
VolleyXmlRequest:
public class VolleyXmlRequest extends Request<XmlPullParser> { private final Response.Listener<XmlPullParser> mListener; public VolleyXmlRequest (int method, String url, Response.Listener<XmlPullParser> listener, Response.ErrorListener errorListener) { super(method,url,errorListener); mListener = listener; } public VolleyXmlRequest (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); } }MainActivity:
Button button5 = (Button) MainActivity.this.findViewById(R.id.btn4); button5.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { VolleyXmlRequest xmlRequest = new VolleyXmlRequest( "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); Toast.makeText(MainActivity.this, "请求失败", Toast.LENGTH_SHORT).show(); } }); mRequestQueue.add(xmlRequest); } });
Jake 大神的 Gist 文件:
https://gist.github.com/JakeWharton/5616899
GitHub 的一个 demo :
https://github.com/stormzhang/AndroidVolley