zoukankan      html  css  js  c++  java
  • Volley框架的使用

    首先先说明一下Volley框架使用的优点:

         通信更快,更简单(数据量不大,但网络通信频繁)

          Get、Post网络请求及网络图像的高效率异步处理

          排序(可以通过网络请求的优先级进行处理)

          网络请求的缓存

         网络图片加载和缓存

         加载图片与监听    ImageRequest:加载网络图片

                                      ImageLoader:缓存,加载图片

                                     NetworkImageView:辅助加载图片

     首先我们需要知道Volley自带了三种返回类型:

         StringRequest:主要使用在对请求数据的返回类型不确定的情况下,StringRequest涵盖了JsonObjectRequest和JsonArrayRequest。

         JsonObjectRequest:当确定请求数据的返回类型为JsonObject时使用。

         JsonArrayRequest:当确定请求数据的返回类型为JsonArray时使用。

    首先我把Volley功能分为了三块,第一块为get网络请求,第二为post网络请求,第三为关于图片的加载

    库依赖:implementation 'com.github.bumptech.glide:volley-integration:4.9.0'(网上随便找的一个);

    1.get网络请求(效果图)

                                                                                 

    代码:

    public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    Button btn1;
    private RequestQueue requestQueue;
    String url = "https://wanandroid.com/article/listproject/0/json";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    }

    private void initView() {//初始化数据
    btn1 = findViewById(R.id.btn1);
    requestQueue = Volley.newRequestQueue(getBaseContext());//消息队列的初始化
    btn1.setOnClickListener(this);//点击事件
    }


    public JsonObjectRequest stringRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {//get
    @Override
    public void onResponse(JSONObject response) {
    Toast.makeText(MainActivity.this, response.toString(), Toast.LENGTH_SHORT).show();
    }
    }, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
    Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_SHORT).show();
    }
    });

    @Override
    public void onClick(View v) {
    switch (v.getId()){
    case R.id.btn1:
    requestQueue.add(stringRequest);
    requestQueue.start();
    stringRequest.setTag("abcGet");
    break;
    }
    }
    }

    2.post网络请求(效果图)      

     代码:

    public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    Button btn2;
    private RequestQueue requestQueue;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    }

    private void initView() {//初始化数据
    btn2 = findViewById(R.id.btn2);
    requestQueue = Volley.newRequestQueue(getBaseContext());
    btn2.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
    case R.id.btn2:
    volleyPost();
    requestQueue.start();
    break;

    }
    }

    private void volleyPost() {
    String link = "https://www.wanandroid.com/user/login";
    // Map<String,String> map = new HashMap<>();//post发送的参数
    // map.put("username","woziji");
    // map.put("password","123456789");
    // map.put("repassword","123456789");
    //将map转化为JSONObject对象
    // JSONObject jsonObject = new JSONObject(map);
    //上面这些是使用JSONObject时需把post参数进行添加
    StringRequest request = new StringRequest(Request.Method.POST, link, new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
    Toast.makeText(MainActivity.this,response,Toast.LENGTH_SHORT).show();
    }
    }, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
    Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_SHORT).show();
    }
    }){//post请求一定要重写getParams();
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
    Map<String,String> map = new HashMap<>();//post发送的参数
    map.put("username","xueyuhang");
    map.put("password","123456789");
    return map;
    }
    };
    //设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
    request.setTag("testPost");
    //将请求加入全局队列中
    requestQueue.add(request);
    }
    }

     3.加载图片  

    效果图:

    ImageRequest加载方式:
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    Button btn1, btn2, btn3;
    ImageView imageView;
    private RequestQueue requestQueue;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    }

    private void initView() {//初始化数据
    btn3 = findViewById(R.id.btn3);
    imageView = findViewById(R.id.img);
    requestQueue = Volley.newRequestQueue(getBaseContext());
    btn3.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btn3:
    imageload();
    break;

    }
    }

    private void imageload() {
    String urls = "https://www.wanandroid.com/blogimgs/62c1bd68-b5f3-4a3c-a649-7ca8c7dfabe6.png";
    ImageRequest imageRequest = new ImageRequest(urls, new Response.Listener<Bitmap>() {
    @Override
    public void onResponse(Bitmap bitmap) {
    imageView.setImageBitmap(bitmap);
    }
    }, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {//maxWidth/maxHeight传0时为原图宽高
    @Override
    public void onErrorResponse(VolleyError error) {
    imageView.setBackgroundColor(Color.BLUE);
    }
    });
    requestQueue.add(imageRequest);

    }


    }
    ImageLoader的缓存加载方式:需要设置加载图片的过程中显示的图片以及加载失败显示的图片
    步骤1:新建一个缓存类实现ImageCache接口(设置缓存图片的大小)当前为10M
    代码:
    public class BitmapCatch implements ImageLoader.ImageCache {//缓存类
    public LruCache<String,Bitmap> cache;
    public int max = 10*1024*1024;//10M

    public BitmapCatch(){
    cache = new LruCache<String,Bitmap>(max){
    @Override
    protected int sizeOf(String key, Bitmap value) {
    return value.getRowBytes()*value.getHeight();
    }
    };
    }
    @Override
    public Bitmap getBitmap(String s) {
    return cache.get(s);
    }

    @Override
    public void putBitmap(String s, Bitmap bitmap) {
    cache.put(s,bitmap);
    }
    }
    活动中的代码:
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    Button btn3;
    ImageView imageView;
    RequestQueue mQueue;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    }

    private void initView() {//初始化数据
    btn3 = findViewById(R.id.btn3);
    imageView = findViewById(R.id.img);
    // requestQueue = Volley.newRequestQueue(getBaseContext());
    mQueue = Volley.newRequestQueue(this);
    btn3.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btn3:
    ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCatch());//调用缓存类
    ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView,R.drawable.ic_launcher_background,R.drawable.ic_launcher_foreground);//三个参数,要显示的控件,加载过程中显示的图片,加载失败显示的图片
    imageLoader.get("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",listener);
    break;
    }
    }
    }
    NetWorkImageView使用方法:类似ImageLoader 他继承ImageView 操作更加简便,易懂
    public class BitmapCatch implements ImageLoader.ImageCache {//缓存类
    public LruCache<String,Bitmap> cache;
    public int max = 10*1024*1024;//10M

    public BitmapCatch(){
    cache = new LruCache<String,Bitmap>(max){
    @Override
    protected int sizeOf(String key, Bitmap value) {
    return value.getRowBytes()*value.getHeight();
    }
    };
    }
    @Override
    public Bitmap getBitmap(String s) {
    return cache.get(s);
    }

    @Override
    public void putBitmap(String s, Bitmap bitmap) {
    cache.put(s,bitmap);
    }
    }
    在xml中添加NetWorkImageView控件
    活动中的代码:
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    Button btn1, btn2, btn3;

    NetworkImageView networkImageView;
    RequestQueue mQueue;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();
    }

    private void initView() {//初始化数据
    btn3 = findViewById(R.id.btn3);

    networkImageView = findViewById(R.id.network);
    // requestQueue = Volley.newRequestQueue(getBaseContext());
    mQueue = Volley.newRequestQueue(this);
    btn3.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btn3:
    networkImageView.setDefaultImageResId(R.drawable.ic_launcher_background);//加载中显示
    networkImageView.setErrorImageResId(R.drawable.ic_launcher_foreground);//记载失败显示
    ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCatch());//或者不写缓存类,直接new ImageLoader(){}重写他的两个方法也可以,不过效果肯定没有缓存类的要理想

    networkImageView.setImageUrl("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",imageLoader);
                    break;
    }
    }
    }



  • 相关阅读:
    ASP.NET MVC中三方登录: 微软、谷歌、Office365
    ComponentOne Xuni助力Xamarin开发者突破百万,快速开发Android、IOS Apps
    深入浅出OOP(四): 多态和继承(抽象类)
    挑灯熬夜看《Build 2015 Keynote》图文笔记
    深入浅出OOP(三): 多态和继承(动态绑定/运行时多态)
    PHP 开发社区微信服务号实战图解
    年卡在手,城墙我走: 记葡萄城控件团队建设
    深入浅出OOP(二): 多态和继承(继承)
    Windows 10 技术预览
    深入浅出OOP(一): 多态和继承(早期绑定/编译时多态)
  • 原文地址:https://www.cnblogs.com/yh0409/p/10783590.html
Copyright © 2011-2022 走看看