安卓开发学习笔记(3):网络请求之Volley

Volley是Google开发的一个网络库:

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


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值