Vollery网络获取

/**
 * 使用Vollery
 * 框架是将所有请求都放置在一个请求队列中,然后Vollery是执行队列中的请求对象。
 * 返回的所有的内容都是在监听中使用回调实现。
 *
 * Vollery中请求的常用类型:
 * StringRequest:字符串请求
 * JsonObjectRequest:jsonObject的请求
 * JsonArrayRequest:jsonArray的请求
 * ImageRequest:图片加载的请求
 *
 * 如果使用缓存:
 * ImageLoader:图片加载的工具
 * ImageCache:定义取出图片,放入图片等缓存操作的接口,需要实现
 *
 * ImageListener:定义了获取返回内容并且处理返回结果bitmap的方式。
 *
 * 使用的时候有两种方式:
 * imageloader.get(url,imagelistener)
 *
 * 使用Vollery了框架中定义的继承自ImageView的控件NetWorkImageView
 * NetWorkImageView.setImageUrl(url,loader)
 *
 * 延伸:1.使用vollery的三级缓存。
 *       2.vollery加载的原理实现---本身就是将请求放入请求的队列中,然后每一个队列对应一个线程池,使用的是线程池执行对应的请求
 *       2.搞定另外一个框架 android-universal-imageloader
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private ImageView imageview;
    private Button reqestStrBtn,requestJsonBnt,requestImageBtn,requestImageCacheBtn;
    private Button requestCacheBtn;


    private RequestQueue queue;//请求队列的声明
    private MyImageCache cache;
    private NetworkImageView iv;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        imageview = (ImageView) findViewById(R.id.imageview);
        reqestStrBtn = (Button) findViewById(R.id.requestStr);
        requestCacheBtn = (Button) findViewById(R.id.requestImageCache);
        requestImageBtn = (Button) findViewById(R.id.requestImage);
        requestJsonBnt = (Button) findViewById(R.id.requestJson);
        iv = (NetworkImageView) findViewById(R.id.iv);
        reqestStrBtn.setOnClickListener(this);
        requestJsonBnt.setOnClickListener(this);
        requestImageBtn.setOnClickListener(this);
        requestCacheBtn.setOnClickListener(this);


        //初始化队列
        queue = Volley.newRequestQueue(this);


        //使用vollery自身的图片呈现控件NetWorkImageView
        iv.setDefaultImageResId(R.mipmap.ic_launcher);//设置预先加载显示的图标
        iv.setErrorImageResId(R.mipmap.ic_launcher);//设置加载错误显示的图标
        cache = new MyImageCache();
        ImageLoader loader  = new ImageLoader(queue,cache);
        iv.setImageUrl("http://img.sc115.com/uploads1/sc/jpgs/1508/fpic6092_sc115.com.jpg",loader);






    }


    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.requestStr:
                requestString();
                break;
            case R.id.requestJson:
                requestJson();
                break;
            case R.id.requestImage:
                loadImageNoCache();
                break;
            case R.id.requestImageCache:
                loadImageCache();
                break;
        }
    }
    //4.带有缓存的图片获取
    private void loadImageCache() {
        //(3)创建MyImageCache对象
        cache = new MyImageCache();
        //(1)创建ImageLoader对象---参数中:请求队列   请求的cache
        ImageLoader loader = new ImageLoader(queue, cache);
        // (5) 实现ImageListener对象----可以直接调用imageLoader的getImageListener方法获取 传入需要赋值的ImageView对象  预先加载显示的图标  加载错误显示的图标
        ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(imageview,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
        //(4)调用get方法直接进行获取
        loader.get("http://img05.tooopen.com/images/20150531/tooopen_sy_127457023651.jpg",imageListener);
    }
    //(2)实现Imagecache接口,重写面的getBitmap和putBitmap两个方法
    class  MyImageCache implements ImageLoader.ImageCache{
        private LruCache lruCache;//声明使用的缓存对象
        private int maxSize = (int) (Runtime.getRuntime().maxMemory()/6);
        public MyImageCache(){
            lruCache = new LruCache(maxSize){
                @Override
                protected int sizeOf(String key, Bitmap value) {
                    return value.getRowBytes()*value.getHeight();
                }
            };
        }
        //获取Bitmap
        @Override
        public Bitmap getBitmap(String s) {
            if (cache==null){
                cache = new MyImageCache();
            }
            Bitmap bitmap = lruCache.get(s);
            if (bitmap!=null){
                Log.i("TAG","从内存缓存中获取");
                return bitmap;
            }


            return null;
        }
        //放置bitmap
        @Override
        public void putBitmap(String s, Bitmap bitmap) {
            if (lruCache.get(s)!=null){
                Log.i("TAG","缓存中存在");
            }else{
                Log.i("TAG","放入缓存");
                lruCache.put(s,bitmap);
            }
        }
    }


    //3.请求网络的图片
    private void loadImageNoCache() {
        Response.Listener listener = new Response.Listener() {
            @Override
            public void onResponse(Bitmap bitmap) {
                imageview.setImageBitmap(bitmap);
            }
        };
        Response.ErrorListener errorListener = new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {


            }
        };
        //创建的图片请求对象
        ImageRequest req = new ImageRequest("图片地址http://pic49.nipic.com/file/20140927/19617624_230415502002_2.jpg",listener,
                2000,1000,
                ImageView.ScaleType.FIT_XY,
                Bitmap.Config.ARGB_8888,
               errorListener );
        queue.add(req);


    }


    //2.请求网络的json
    private void requestJson() {
        Response.Listener listener = new Response.Listener() {
            @Override
            public void onResponse(JSONObject object) {
                try {
                    JSONArray array = object.getJSONArray("datas");
                    final int length = array.length();
                    for (int i = 0; i < length; i++) {
                        JSONObject obj = array.getJSONObject(i);
                        Log.i("TAG","获取城市:"+obj.getString("name"));
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        };
        Response.ErrorListener errorListener = new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Log.i("TAG","volleryError:"+volleyError);
            }
        };
        //创建json对应的类型的请求---参数三:如果在请求的过程中还需要给服务器进行json的传值就指定jsonObject对象。 如果为null默认使用的是get,不为null就是post
        JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET,"访问地址",null,listener,errorListener);
        //添加进入请求队列
        queue.add(req);
    }


    //1.请求网络的字符串
    private void requestString() {
        Response.Listener listener = new Response.Listener() {
            //请求执行之后返回的结果的回调方法
            @Override
            public void onResponse(String s) {
//                Log.i("TAG",s);
                Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
            }


        };
        Response.ErrorListener errorListener = new Response.ErrorListener() {
            //请求错误返回的结果
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Log.i("TAG","volleyError:"+volleyError.getMessage());
            }
        };
        //1.创建请求对象----请求方式get/post   请求的路径  请求正常执行的监听   请求错误回调的监听
//        StringRequest req = new StringRequest(Request.Method.GET,"访问地址",listener,errorListener);
        //使用post请求的方式
          StringRequest req = new StringRequest(Request.Method.POST,"访问地址",listener,errorListener){
              //处理传递的参数
              @Override
              protected Map getParams() throws AuthFailureError {
                  Map map = new HashMap();
                  map.put("uname","admin12");
                  map.put("upass","1234");
                  return map;
              }
          };
        //2.将请求放入队列中
        queue.add(req);
    }
}

你可能感兴趣的:(安卓)