您的位置:首页 > 编程语言 > Go语言

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android开发 网络