Volley框架详解

来源:互联网 发布:淘宝联盟怎么微信推广 编辑:程序博客网 时间:2024/05/24 00:09
Volley的简介和特点:
特点:并发性,效率高,性能好。
Volley  的英文含义:并发,齐射
 2013年开发大会上提出的网络请求工具。
网络请求的好处:
 1.网络请求效率较高,而且写法简单,开发效率会得到很大提升。
 2.可以处理get,post等网络请求同时可以高效率的加载网络图片。
 3.可以不同的网络请求进行排序,根据优先级进行处理。
 4.网络请求缓存处理。
 5.多级别的取消请求。
 6.和activity的生命周期进行联动。
为什么使用volley?
功能上:
get和post网络请求效率更高
图片加载有缓存功能。
其他:谷歌官方出版,权威之作。
volley请求的缺点
不支持文件的上传功能。
下面我们步入正题Volley的简单使用:
1.在全局变量中创建请求队列(公用)一定要在清单列表中注册
  1. public class MyApp extends Application{
  2. //1.创建请求队列,可以设置为全局变量
  3. private static RequestQueue mQueue;
  4. @Override
  5. public void onCreate() {
  6. super.onCreate();
  7. //初始化请求队列
  8. mQueue = Volley.newRequestQueue(getApplicationContext());
  9. }
  10. public static RequestQueue getHttpQueue(){
  11. return mQueue;
  12. }
  13. }

用GET的方式获取字符串
  1. public class StringRequestActivity extends AppCompatActivity {
  2. private TextView mTv;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_string_request);
  7. mTv = (TextView) findViewById(R.id.tv);
  8. volleyGet(Api.WelcomeUse);
  9. }
  10. /**
  11. * listener : 当请求数据成功时,会回调的接口
  12. * ErrorListener: 当请求失败时会回调的接口。
  13. * */
  14. public void volleyGet(String path){
  15. //2.挑选合适的请求对象
  16. StringRequest request = new StringRequest(Request.Method.GET, path, new Response.Listener<String>() {
  17. @Override
  18. public void onResponse(String s) {
  19. mTv.setText(s);
  20. }
  21. }, new Response.ErrorListener() {
  22. @Override
  23. public void onErrorResponse(VolleyError volleyError) {
  24. mTv.setText("网络请求失败");
  25. }
  26. });
  27. //给请求对象设置标记,为了取消请求用
  28. request.setTag("volleyGet");
  29. //3.添加请求对象到请求队列当中
  30. MyApp.getHttpQueue().add(request);
  31. }
  32. @Override
  33. protected void onStop() {
  34. super.onStop();
  35. //取消请求队列当中指定的请求对象
  36. MyApp.getHttpQueue().cancelAll("volleyGet");
  37. }
  38. }
用POST的方式获取字符串
  1. public class StringPostActivity extends AppCompatActivity {
  2. private TextView mTv;
  3. private String url = "http://www.moviebase.cn/uread/app/splash/splashList";
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_string_request);
  8. mTv = (TextView) findViewById(R.id.tv);
  9. volleyPost(url);
  10. }
  11. public void volleyPost(String url){
  12. StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
  13. @Override
  14. public void onResponse(String s) {
  15. mTv.setText(s);
  16. }
  17. }, new Response.ErrorListener() {
  18. @Override
  19. public void onErrorResponse(VolleyError volleyError) {
  20. mTv.setText(volleyError.getMessage());
  21. }
  22. }){
  23. //post请求必须要重写的方法 map当中包含写入到服务器的数据,key代表等号左边的内容
  24. @Override
  25. protected Map<String, String> getParams() throws AuthFailureError {
  26. Map<String,String>map = new HashMap<>();
  27. map.put("platform","2");
  28. map.put("appVersion","1.7.0");
  29. map.put("osType","2");
  30. return map;
  31. }
  32. };
  33. //注意:下面是add不是cancelAll(取消)
  34. MyApp.getHttpQueue().add(request);
  35. }
  36. }
获取Json数据里的最外层的对象(最外层必须是对象),不能用Gson解析比较鸡肋.
  1. public class JsonObjectActivity extends AppCompatActivity {
  2. private TextView mTv;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_string_request);
  7. mTv = (TextView) findViewById(R.id.tv);
  8. volleyGet(Api.WelcomeUse);
  9. }
  10. public void volleyGet(String path) {
  11. //使用了JsonObjectRequest或者JsonArrayRequest 必须用原生解析法
  12. JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, path, null,
  13. new Response.Listener<JSONObject>() {
  14. @Override
  15. public void onResponse(JSONObject jsonObject) {
  16. try {
  17. String retCode = jsonObject.getString("retCode");
  18. JSONObject object1 = jsonObject.getJSONObject("splash");
  19. String imgurl = object1.getString("imgurl");
  20. mTv.setText(imgurl);
  21. } catch (JSONException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }, new Response.ErrorListener() {
  26. @Override
  27. public void onErrorResponse(VolleyError volleyError) {
  28. mTv.setText(volleyError.getMessage());
  29. }
  30. });
  31. //添加请求到请求队列
  32. MyApp.getHttpQueue().add(request);
  33. }
  34. }
JsonArray获取Json数据里的最外层的数组(最外层必须是数组),不能用Gson解析比较鸡肋.
和上面的代码比较类似;
权限
  1. <uses-permission android:name="android.permission.INTERNET"/>
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>




原创粉丝点击