• Android笔记(六十二)网络框架volley


    什么是Volley

           很多时候,我们的APP都需要用到网络技术,使用HTTP协议来发送接收数据,谷歌推出了一个网络框架——volley,该框架适合进行数据量不大,但通信频繁的网络操作。

           它的优点:

           (1)默认Android2.3及以上基于HttpURLConnection,2.3以下使用基于HttpClient;

           (2)符合Http 缓存语义 的缓存机制(提供了默认的磁盘和内存等缓存);

           (3)请求队列的优先级排序;

           (4)提供多样的取消机制;

           (5)提供简便的图片加载工具(其实图片的加载才是我们最为看重的功能)

           它的缺点:

           不适合数据量大的传输,例如下载、视频传输等

           首先获取Volley的jar包,具体方法不赘述。

           https://android.googlesource.com/platform/frameworks/volley  

    如何使用Volley

          最简单的使用方法可以归纳为:

          1.创建一个请求队列→2.创建一个请求→3.将请求加到队列中

          就是这么简单!

    StringRequest

          一个简单的例子:

    MainActivity.java

    package com.example.volleydemo;
    
    import com.android.volley.RequestQueue;
    import com.android.volley.Response;
    import com.android.volley.Response.Listener;
    import com.android.volley.VolleyError;
    import com.android.volley.toolbox.StringRequest;
    import com.android.volley.toolbox.Volley;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
    
        private Button bt;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            bt = (Button) findViewById(R.id.bt);
            bt.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    // 定义一个请求队列
                    RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
    
                    // 定义一个字符串请求
                    // StringRequest的构造方法需要传入三个参数,第一个参数是我们要请求的地址,第二个参数当我们的请求响应成功时候的回调,第三个参数是当我们请求失败时候的回调
                    StringRequest sr = new StringRequest("http://www.baidu.com", new Listener<String>() {
    
                        @Override
                        public void onResponse(String response) {
                            Log.d("TTTT", response);
                        }
                    }, new Response.ErrorListener() {
    
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Log.d("TTTT", "连接出错啦!!");
                        }
                    });
                    // 将请求加入到队列中
                    requestQueue.add(sr);
    
                }
            });
    
        }
    }

    activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.volleydemo.MainActivity" >
    
        <Button
            android:id="@+id/bt"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="click me" />
    
    </RelativeLayout>

           因为我们需要访问网络,我们还需要添加INTERNET权限,我们先不加试试,不加权限,运行的结果是:

          可以看到执行了onErrorResponse中内容

          我们加上权限

        <uses-permission android:name="android.permission.INTERNET"/>

          运行结果:

          执行成功!Volley就是这么简单

    JsonRequest

    MainActivity.java

    package com.example.volleydemo;
    
    import org.json.JSONObject;
    
    import com.android.volley.RequestQueue;
    import com.android.volley.Response;
    import com.android.volley.VolleyError;
    import com.android.volley.toolbox.JsonObjectRequest;
    import com.android.volley.toolbox.Volley;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
    
        private Button bt;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            bt = (Button) findViewById(R.id.bt);
            bt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 定义一个请求队列
                    RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
                    // 定义一个jsonobject请求
                    // JsonObjectRequest的构造方法需要传入三个参数,第一个参数是我们要请求的地址,第二个参数是我们要传递给服务器的参数,如果没有,则为null,第三个参数当我们的请求响应成功时候的回调,第四个参数是当我们请求失败时候的回调
                    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
                            "https://api.heweather.com/x3/weather?cityid=CN101010100&key=5d520eb089e646acb270521a7e387",
                            null, new Response.Listener<JSONObject>() {
                        public void onResponse(JSONObject response) {
                            Log.d("TTTT", response.toString());
                        }
                    }, new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            // TODO Auto-generated method stub
                        }
                    });
                    // 将请求加入到队列中
                    requestQueue.add(jsonObjectRequest);
                }
            });
        }
    }

           执行结果:成功!

    ImageRequest

          ImageRequest的使用方法和之前的一样,也是创建队列,创建请求,把请求加入到队列中,只不过ImageRequest的构造方法参数比较多,他们的含义分别为:

          url:请求地址

          listener:相应成功回调方法

          maxWidth:允许图片的最大宽度,如果指定的网络图片宽度大于这里的值,则会进行压缩,如果为0则不进行压缩

          maxHeight:允许图片的最大高度,如果指定的网络图片高度大于这里的值,则会进行压缩,如果为0则不进行压缩

          decodeConfig:执行图片的颜色属性Bitmap.Config下的几个常量都可以在这里使用

          errorListener:请求失败回调方法

    MainActivity.java

    package com.example.volleydemo;
    
    import com.android.volley.RequestQueue;
    import com.android.volley.Response;
    import com.android.volley.VolleyError;
    import com.android.volley.toolbox.ImageRequest;
    import com.android.volley.toolbox.Volley;
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.drawable.BitmapDrawable;
    import android.graphics.drawable.Drawable;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    @SuppressLint("NewApi")
    public class MainActivity extends Activity {
    
        private Button bt;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            bt = (Button) findViewById(R.id.bt);
            bt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 定义一个请求队列
                    RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
                    // 定义一个ImageRequest请求
                    ImageRequest imageRequest = new ImageRequest(
                            "http://images.cnblogs.com/cnblogs_com/xs104/722323/o_pic.jpg",
                            new Response.Listener<Bitmap>() {
                        @Override
                        public void onResponse(Bitmap response) {
                            // 将请求返回的Bitmap对象转换为Drawable对象
                            Drawable drawable = new BitmapDrawable(response);
                            // 将图片设置为背景
                            findViewById(R.id.layout).setBackground(drawable);
                        }
                    }, 0, 0, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
    
                        }
                    });
                    // 将请求加入到队列中
                    requestQueue.add(imageRequest);
                }
            });
        }
    }

          运行结果:

  • 相关阅读:
    iterm2 关闭命令行的行数限制
    设置Mac关闭显示器后不睡眠
    设置iPhone内容隔空投送到mac
    Mac关闭动画效果
    mac使用Jmeter
    Mac 设置文件夹共享
    设置iPhone可以投屏到mac上
    Mac关闭显示亮度自动调节功能
    Mac系统无法使用root用户
    Mac设置主显示器
  • 原文地址:https://www.cnblogs.com/xs104/p/5055888.html
Copyright © 2020-2023  润新知