Volley是google在2013年I/O大会上发布的关于网络请求的框架,其目的是为了解决HttpUrlConnect和
HttpClient(在android6.0中已经被废弃)使用不方便的问题,从字面上我们就可以看出来此框架的优点—-Volley(齐
射,发射),就好像很多人一起射箭,注意:是射箭,不是很多人一起发大炮,这点很重要,也是volley的一个特
性,它支持数据量不大,但是请求频繁的网络请求,如请求文字,图片,然而,如果是音频和视频的下载,这就属
于发大炮的级别了,volley可玩不转,所以使用的时候一定要注意。
Volley特点
- 通信更快,更简单
- Get、Post网络请求及网络图像的高效率异步处理请求
- 排序,对不同的网络请求进行优先级反应处理
- 网络请求的缓存
- 多级别取消请求
- 和Activity生命周期的联动
Volley不适合大文件的上传的下载
Volley框架的使用
Volley的get和post请求方式的使用
Get和Post请求接口数据的使用
· StringReuiest 用于对请求的数据返回结果类型不确定的情况下。StringReuiest涵盖后两种请求对象
· JsonObjectQuest 用于对请求的数据返回JsonObject类型
· JsonArrayRequest 用于对请求的数据返回JsonArray类型
Volley的网络请求队列建立和取消队列请求
使用Volley需要建立一个全局的请求队列,这样我们就可以将一个请求加入到这个全局队列中,并可以管理整个
APP的所有请求,包括取消一个或所有的请求。
Volley与Activity生命周期的联动
Volley中的请求是与Activity的生命周期进行关联。这样可以在Android销毁时关闭Volley的请求,防止请求在后台
运行造成内存溢出等情况发生。与Activity生命周期进行联动时需要设置Tag标签,因为取消请求需要在请求队列中
通过Tag标签进行查找,在Activity的onStop中执行取消请求的操作。
实例演示
使用Volley前需要往项目中导入Volley的jar包。
首先我们需要自定义一个Application用于创建一个全局的请求队列。
MyApplication.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import android.app.Application; import com.android.volley.RequestQueue; import com.android.volley.toolbox.Volley;
public class MyApplication extends Application{ public static RequestQueue queues;
@Override public void onCreate() { super.onCreate(); queues = Volley.newRequestQueue(getApplicationContext()); }
public static RequestQueue getHttpQueues(){ return queues; } }
|
AndroidManifest.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.gkdoe.volleydemo">
<uses-permission android:name="android.permission.INTERNET" /> <application android:name=".MyApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
</manifest>
|
使用Get方式请求数据返回StringRequest对象
当想返回String类型的请求结果数据或者不清楚返回什么类型时可以用StringRequest对象。
下面使用Get请求方式返回一个String类型的手机归属地信息。
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest;
public class MainActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); volley_Get(); }
private void volley_Get() { String url = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443";
StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String s) { Toast.makeText(MainActivity.this,s, Toast.LENGTH_LONG).show(); } },new Response.ErrorListener(){ @Override public void onErrorResponse(VolleyError volleyError) { Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show(); } }); request.setTag("abcGet"); MyApplication.getHttpQueues().add(request); } }
|
运行结果:
使用Get方式请求数据返回JsonObjectRequest对象
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.JsonObjectRequest; import org.json.JSONObject;
public class MainActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); jsonObject_Get(); }
private void jsonObject_Get(){ String url = "http://api.juheapi.com/japi/toh?key=7bc8ff86168092de65576a6166bfc47b&v=1.0&month=11&day=1"; JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>(){ @Override public void onResponse(JSONObject jsonObject){ Toast.makeText(MainActivity.this,jsonObject.toString(),Toast.LENGTH_LONG).show(); } }, new Response.ErrorListener(){ @Override public void onErrorResponse(VolleyError volleyError){ Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show(); } }); request.setTag("request"); MyApplication.getHttpQueues().add(request); } }
|
使用Post方式请求数据返回StringRequest对象
使用Post方式需要手动传递请求参数,可以重写Request类的getParams()方法将请求参数名和参数值放入Map中进行传递。
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; import com.android.volley.AuthFailureError; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import java.util.HashMap; import java.util.Map;
public class MainActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); volley_Post(); }
private void volley_Post(){ String url = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm"; StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { @Override public void onResponse(String s) { Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show(); } }, new Response.ErrorListener(){ @Override public void onErrorResponse(VolleyError volleyError) { Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show(); } }){ @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String,String> map = new HashMap<>(); map.put("tel","13646823863"); return map; } }; request.setTag("testPost"); MyApplication.getHttpQueues().add(request); } }
|
使用Post方式请求数据返回JsonObjectRequest对象
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.JsonObjectRequest; import org.json.JSONObject; import java.util.HashMap; import java.util.Map;
public class MainActivity extends AppCompatActivity{ @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); volley_Post(); }
private void volley_Post(){ String url = "http://api.juheapi.com/japi/toh?"; Map<String,String> map = new HashMap<String,String>(); map.put("key","7bc8ff86168092de65576a6166bfc47b"); JSONObject jsonobj = new JSONObject(map); JsonObjectRequest JsonRequest = new JsonObjectRequest(Request.Method.POST, url, jsonobj, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject jsonObject) { Toast.makeText(MainActivity.this, "成功", Toast.LENGTH_SHORT).show(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Toast.makeText(MainActivity.this, "失败", Toast.LENGTH_SHORT).show(); } }); JsonRequest.setTag("testPost"); MyApplication.getHttpQueues().add(JsonRequest); } }
|