51dev.com IT技术开发者社区

51dev.com 技术开发者社区

Volley之Get

Android互联网报道阅读(18)2019-09-18 收藏0次评论

volley的英文意思为'群发'、'迸发'。 Volley是2013年谷歌官方发布的一款android平台上的网络通信库。 Volley非常适合一些数据量不大,但需要频繁通信的网络操作。 使用Volley进行网络开发可以使我们的开发效率得到很大的提升, 而且性能的稳定性也比较高。但是Volley不适用于文件的上传下载操作。

Volley的特点:

1 使网络通信更快,更简单,更健壮;

2 Get/Post网络请求及网络图像的高效率异步请求;  

3 可以对网络请求的优先级进行排序处理;

4 可以进行网络请求的缓存;

5 可以取消多级别请求;

6 可以和Activity生命周期联动。

为什么要使用Volley?

功能上:
      高效的Get/Post方式的数据请求交互;
      网络图片的加载和缓存过程简单化。

其他:
      谷歌官方推出的,比较权威;
      性能很稳定、强劲。

关于Volley
1.Volley的网络请求队列建立与取消队列请求

使用Volley需要建立一个全局的请求队列,这样我们就可以将一个请求加入到这个全局队列中,并可以管理整个APP的所有请求,包括取消一个或所有的请求。

2.Volley的Get和Post请求方式的使用

Volley的Get和Post请求方式其实是对Android原生Get和Post请求方式进行了二次封装,对效率等进行优化。在使用Get和Post请求方式之前,我们要确定所请求的数据返回什么对象。

Volley自带了三种返回类型:

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

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

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

3.Volley与Activity生命周期的联动

简单来说就是Volley中的请求是与Activity的生命周期进行关联。这样可以在Android销毁时关闭Volley的请求,防止请求在后台运行造成内存溢出等情况发生。与Activity生命周期进行联动时需要设置Tag标签,因为取消请求需要在请求队列中通过Tag标签进行查找,在Activity的onStop中执行取消请求的操作。

使用Volley前需要往项目中导入Volley的jar包
jar包下载地址:[volley.jar]

Volley实例一:使用Get方式请求数据返回StringRequest对象

当想返回String类型的请求结果数据或者不清楚返回什么类型时可以用StringRequest对象。

使用Get请求方式返回一个String类型的手机归属地信息

MyApplication.java

import android.app.Application;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;

public class MyApplication extends Application {
    public static RequestQueue queue;
    @Override
    public void onCreate() {
        super.onCreate();
        queue = Volley.newRequestQueue(getApplicationContext());
    }
    /**
     * 获取请求队列
     */
    public static RequestQueue getHttpQueue(){
        return queue;
    }
}

AndroidManifest.xml



    
    
    
    
        
            
                
                
            
        
    

MainActivity.java

public class MainActivity extends AppCompatActivity {

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

    /**
     *  new StringRequest(int method,String url,Listener listener,ErrorListener errorListener)
     *  method:请求方式,Get请求为Method.GET,Post请求为Method.POST
     *  url:请求地址
     *  listener:请求成功后的回调
     *  errorListener:请求失败的回调
     */
    private void volleyGet() {
        String url = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15233333333";
        StringRequest request = new StringRequest(Method.GET, url,
                new Listener() {
                    @Override
                    public void onResponse(String s) {//s为请求返回的字符串数据
                        Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show();
                    }
                },
                new ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {
                        Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show();
                    }
                });
        //设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
        request.setTag("testGet");
        //将请求加入全局队列中
        MyApplication.getHttpQueues().add(request);
    }
}

运行结果:
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxzdHJvbmc+Vm9sbGV5yrXA/bb+o7rKudPDR2V0t73Kvcfrx/PK/b7dt7W72Epzb25PYmplY3RSZXF1ZXN0ttTP8zwvc3Ryb25nPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9wPg0KPHA+PGNvZGU+PGNvZGU+PGNvZGU+PGNvZGU+PGNvZGU+08nT2s7Sw8fWqrXA1eK49sfrx/O3tbvYtcTKx0pzb2648cq9tcTK/b7do6zL+dLUztLDx7/J0tTWsb3TyrnTw0pzb25PYmplY3RSZXF1ZXN01/fOqsfrx/O3tbvYveG5+7bUz/OhozwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9wPg0KPHA+PGNvZGU+PGNvZGU+PGNvZGU+PGNvZGU+PGNvZGU+yrnTw0dldMfrx/O3vcq9t7W72NK7uPZKc29uuPHKvbXESVC12Na30MXPoqOs0N64xMnP0ru49sD919PW0LXETWFpbkFjdGl2aXR5LmphdmHOxLz+vLS/yaGjPGJyIC8+DQo8c3Ryb25nPk1haW5BY3Rpdml0eS5qYXZhPC9zdHJvbmc+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L3A+DQo8cHJlIGNsYXNzPQ=="brush:java;"> /** * new JsonObjectRequest(int method,String url,JsonObject jsonObject,Listener listener,ErrorListener errorListener) * method:请求方式,Get请求为Method.GET,Post请求为Method.POST * url:请求地址 * JsonObject:Json格式的请求参数。如果使用的是Get请求方式,请求参数已经包含在url中,所以可以将此参数置为null * listener:请求成功后的回调 * errorListener:请求失败的回调 */ private void volleyGet() { String url = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.4.255.255"; JsonObjectRequest request = new JsonObjectRequest(Method.GET, url, null, new Listener() { @Override public void onResponse(JSONObject jsonObject) {//jsonObject为请求返回的Json格式数据 Toast.makeText(MainActivity.this,jsonObject.toString(),Toast.LENGTH_LONG).show(); } }, new ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show(); } }); //设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找 request.setTag("testGet"); //将请求加入全局队列中 MyApplication.getHttpQueues().add(request); }

Volley实例三:使用Get方式请求数据返回JsonArrayRequest对象
使用Get请求方式返回一个Json格式的IP地址信息,修改上一个例子中的MainActivity.java文件即可。
MainActivity.java

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;

import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;

import org.json.JSONArray;

public class MainActivity extends AppCompatActivity {

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

    public void volley_Get() {
        String url = "http://192.168.1.108:8080/json/JsonServlet";
        JsonArrayRequest request = new JsonArrayRequest(url,
                new Response.Listener() {

                    @Override
                    public void onResponse(JSONArray response) {//请求响应返回的JSONArray
                        Log.i("onResponse",response.toString());
                        Toast.makeText(MainActivity.this, response.toString(), Toast.LENGTH_SHORT).show();
                    }
                },
                new Response.ErrorListener() {

                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.e("onResponse",error.toString());
                        Toast.makeText(MainActivity.this,error.toString(), Toast.LENGTH_SHORT).show();
                    }
                });
        request.setTag("abcGet");
        MyApplication.getHttpQueue().add(request);
    }
}

由于没有在网上找到返回JsonArray的api,所以自己本地创建一个
打开eclipse创建一个Dynamic Web Project,在src中创建三个类JsonService.java、JsonServlet.java、Person.java。
JsonService.java

import java.util.ArrayList;
import java.util.List;

public class JsonService {

    public static List getListPerson() {
        List mLists = new ArrayList();
        mLists.add(new Person("张三", "北京", 20));
        mLists.add(new Person("李四", "上海", 30));
        mLists.add(new Person("王五", "深圳", 35));
        return mLists;
    }
}

JsonServlet.java

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/JsonServlet")
public class JsonServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public JsonServlet() {
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

        response.setContentType("text/html");
        response.setCharacterEncoding("UTF-8");

        PrintWriter out = response.getWriter();
        List persons = JsonService.getListPerson();
        StringBuffer sb = new StringBuffer();
        sb.append('[');

        for (Person person : persons) {
            sb.append('{').append(""name":")
                    .append(""" + person.getName() + """).append(",");
            sb.append(""city":").append(""" + person.getCity() + """)
                    .append(",");
            sb.append(""age":").append(person.getAge());
            sb.append('}').append(",");
        }
        sb.deleteCharAt(sb.length() - 1);
        sb.append(']');
        out.write(new String(sb));
        out.flush();
        out.close();
    }
}

Person.java

public class Person {
    private String name;
    private String city;
    private int age;
    public Person(String name, String city, int age) {
        super();
        this.name = name;
        this.city = city;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", city=" + city + ", age=" + age + "]";
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

配置服务器后运行结果:

注意:

浏览器中打开的时候,地址可以是
http://localhost:8080/json/JsonServlet或者是
http://192.168.1.108:8080/json/JsonServlet

但是在android访问时,只能是
http://192.168.1.108:8080/json/JsonServlet
同时需要注意自己主机IP地址是变化的,连接报错时,一定就是IP地址有问题。

此时运行android studio后效果:

以上就是Volley之Get的全部内容,请多关注【51DEV】IT技术开发者社区。