Google开源库之Volley的初步介绍
2015-07-26 00:06
459 查看
Volley是Google在2013年推出的网络请求库,在现在APP普遍与网络交互的现在,volley和http通信技术成为十分重要的技术。volley可以让网络铜芯线更快,更简单,更健壮。volley适合数据量不大但通信频繁的场景,先看volley的使用方法。
RequestQueue mRequestQueue = Volley.newRequestQueue(context); JsonObjectRequest req = new JsonObjectRequest(URL, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { try { VolleyLog.v("Response:%n %s", response.toString(4)); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.e("Error: ", error.getMessage()); } }); mRequestQueue.add(req);
volley提供的功能大概有以下几点:
异步获得JSON的键值对,或者图片等
网络Request的排序
Request优先级处理
缓存
多级别的取消请求
与Activity生命周期联动
volley的核心有两点:
RequestQueue
Request
下面通过demo来展示volley的用法
package com.example.doqin.update; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import com.android.volley.Request; 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 org.json.JSONObject; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getJSONVolley(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } //获得JSON字符串 public void getJSONVolley() { RequestQueue requestQueue = Volley.newRequestQueue(this); String url = ""; JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { System.out.println("response=" + response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { System.out.println("error"); } }); requestQueue.add(jsonObjectRequest); } }
以上就是使用Volley做JSON字符串的请求,注意Internet权限的添加。
下面介绍Volley的第二个用法,异步加载图片。
package com.example.doqin.update; import android.graphics.Bitmap; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.util.LruCache; import android.view.Menu; import android.view.MenuItem; import android.widget.ImageView; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.ImageLoader; import com.android.volley.toolbox.ImageLoader.ImageCache; import com.android.volley.toolbox.JsonObjectRequest; import com.android.volley.toolbox.Volley; import org.json.JSONObject; public class MainActivity extends ActionBarActivity { private ImageView iv1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv1 = (ImageView) findViewById(R.id.id_progress); getJSONVolley(); loadImageVolley(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } //获得JSON字符串 public void getJSONVolley() { RequestQueue requestQueue = Volley.newRequestQueue(this); String url = ""; JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { System.out.println("response=" + response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { System.out.println("error"); } }); requestQueue.add(jsonObjectRequest); } //异步加载图片 public void loadImageVolley() { String url = ""; RequestQueue requestQueue = Volley.newRequestQueue(this); //缓存操作,返回图片Bitmap final LruCache<String, Bitmap> lruCache = new LruCache<String, Bitmap>(20); ImageCache imageCache = new ImageCache() { @Override public Bitmap getBitmap(String key) { return lruCache.get(key); } @Override public void putBitmap(String key, Bitmap bitmap) { lruCache.put(key,bitmap); } }; ImageLoader imageLoader = new ImageLoader(requestQueue,imageCache); ImageLoader.ImageListener listener = ImageLoader.getImageListener(iv1,R.drawable.abc_btn_default_mtrl_shape,R.drawable.abc_btn_borderless_material); imageLoader.get(url,listener); } }
RequestQueue
RequestQueue是一个请求队列,负责分发请求,取缓存或者读网络,所以其构造函数中需要一个Cache对象和一个Network对象,还有一个ResponseDlivery对象用于派发请求结果。新建RequestQueue后要条用它的start方法,在start中会新建一个CacheDispatcher和几个NetworkDispatcher分别处理缓存与网络请求。
通过RequestQueue的add方法添加请求。
JsonObjectRequest
讲请求结果解析成JSONObject。JSONArrayRequest
将请求结果解析成JSONArray。Cancel
通过给每个请求设置一个Tag,然后通过cancelAll(final Object tag)就可以取消对应Tag的请求,也可以直接使用RequestFilter。以上就是我看到的一些基本的Volley方法,原文更详细的介绍Volley的用法
明天争取写完Volley的兄弟框架 Android-Async-Http,个人觉得后者的用法更为广泛一点。
PS/今天晚上TI5的外卡赛开始了哦,VG加油,NewBee加油!
2015-7-26-0.04