/**
* 使用Vollery
* 框架是将所有请求都放置在一个请求队列中,然后Vollery是执行队列中的请求对象。
* 返回的所有的内容都是在监听中使用回调实现。
*
* Vollery中请求的常用类型:
* StringRequest:字符串请求
* JsonObjectRequest:jsonObject的请求
* JsonArrayRequest:jsonArray的请求
* ImageRequest:图片加载的请求
*
* 如果使用缓存:
* ImageLoader:图片加载的工具
* ImageCache:定义取出图片,放入图片等缓存操作的接口,需要实现
*
* ImageListener:定义了获取返回内容并且处理返回结果bitmap的方式。
*
* 使用的时候有两种方式:
* imageloader.get(url,imagelistener)
*
* 使用Vollery了框架中定义的继承自ImageView的控件NetWorkImageView
* NetWorkImageView.setImageUrl(url,loader)
*
* 延伸:1.使用vollery的三级缓存。
* 2.vollery加载的原理实现---本身就是将请求放入请求的队列中,然后每一个队列对应一个线程池,使用的是线程池执行对应的请求
* 2.搞定另外一个框架 android-universal-imageloader
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private ImageView imageview;
private Button reqestStrBtn,requestJsonBnt,requestImageBtn,requestImageCacheBtn;
private Button requestCacheBtn;
private RequestQueue queue;//请求队列的声明
private MyImageCache cache;
private NetworkImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
imageview = (ImageView) findViewById(R.id.imageview);
reqestStrBtn = (Button) findViewById(R.id.requestStr);
requestCacheBtn = (Button) findViewById(R.id.requestImageCache);
requestImageBtn = (Button) findViewById(R.id.requestImage);
requestJsonBnt = (Button) findViewById(R.id.requestJson);
iv = (NetworkImageView) findViewById(R.id.iv);
reqestStrBtn.setOnClickListener(this);
requestJsonBnt.setOnClickListener(this);
requestImageBtn.setOnClickListener(this);
requestCacheBtn.setOnClickListener(this);
//初始化队列
queue = Volley.newRequestQueue(this);
//使用vollery自身的图片呈现控件NetWorkImageView
iv.setDefaultImageResId(R.mipmap.ic_launcher);//设置预先加载显示的图标
iv.setErrorImageResId(R.mipmap.ic_launcher);//设置加载错误显示的图标
cache = new MyImageCache();
ImageLoader loader = new ImageLoader(queue,cache);
iv.setImageUrl("http://img.sc115.com/uploads1/sc/jpgs/1508/fpic6092_sc115.com.jpg",loader);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.requestStr:
requestString();
break;
case R.id.requestJson:
requestJson();
break;
case R.id.requestImage:
loadImageNoCache();
break;
case R.id.requestImageCache:
loadImageCache();
break;
}
}
//4.带有缓存的图片获取
private void loadImageCache() {
//(3)创建MyImageCache对象
cache = new MyImageCache();
//(1)创建ImageLoader对象---参数中:请求队列 请求的cache
ImageLoader loader = new ImageLoader(queue, cache);
// (5) 实现ImageListener对象----可以直接调用imageLoader的getImageListener方法获取 传入需要赋值的ImageView对象 预先加载显示的图标 加载错误显示的图标
ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(imageview,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
//(4)调用get方法直接进行获取
loader.get("http://img05.tooopen.com/images/20150531/tooopen_sy_127457023651.jpg",imageListener);
}
//(2)实现Imagecache接口,重写面的getBitmap和putBitmap两个方法
class MyImageCache implements ImageLoader.ImageCache{
private LruCache lruCache;//声明使用的缓存对象
private int maxSize = (int) (Runtime.getRuntime().maxMemory()/6);
public MyImageCache(){
lruCache = new LruCache(maxSize){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
}
};
}
//获取Bitmap
@Override
public Bitmap getBitmap(String s) {
if (cache==null){
cache = new MyImageCache();
}
Bitmap bitmap = lruCache.get(s);
if (bitmap!=null){
Log.i("TAG","从内存缓存中获取");
return bitmap;
}
return null;
}
//放置bitmap
@Override
public void putBitmap(String s, Bitmap bitmap) {
if (lruCache.get(s)!=null){
Log.i("TAG","缓存中存在");
}else{
Log.i("TAG","放入缓存");
lruCache.put(s,bitmap);
}
}
}
//3.请求网络的图片
private void loadImageNoCache() {
Response.Listener listener = new Response.Listener() {
@Override
public void onResponse(Bitmap bitmap) {
imageview.setImageBitmap(bitmap);
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
};
//创建的图片请求对象
ImageRequest req = new ImageRequest("图片地址http://pic49.nipic.com/file/20140927/19617624_230415502002_2.jpg",listener,
2000,1000,
ImageView.ScaleType.FIT_XY,
Bitmap.Config.ARGB_8888,
errorListener );
queue.add(req);
}
//2.请求网络的json
private void requestJson() {
Response.Listener listener = new Response.Listener() {
@Override
public void onResponse(JSONObject object) {
try {
JSONArray array = object.getJSONArray("datas");
final int length = array.length();
for (int i = 0; i < length; i++) {
JSONObject obj = array.getJSONObject(i);
Log.i("TAG","获取城市:"+obj.getString("name"));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.i("TAG","volleryError:"+volleyError);
}
};
//创建json对应的类型的请求---参数三:如果在请求的过程中还需要给服务器进行json的传值就指定jsonObject对象。 如果为null默认使用的是get,不为null就是post
JsonObjectRequest req = new JsonObjectRequest(Request.Method.GET,"访问地址",null,listener,errorListener);
//添加进入请求队列
queue.add(req);
}
//1.请求网络的字符串
private void requestString() {
Response.Listener listener = new Response.Listener() {
//请求执行之后返回的结果的回调方法
@Override
public void onResponse(String s) {
// Log.i("TAG",s);
Toast.makeText(MainActivity.this,s,Toast.LENGTH_SHORT).show();
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
//请求错误返回的结果
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.i("TAG","volleyError:"+volleyError.getMessage());
}
};
//1.创建请求对象----请求方式get/post 请求的路径 请求正常执行的监听 请求错误回调的监听
// StringRequest req = new StringRequest(Request.Method.GET,"访问地址",listener,errorListener);
//使用post请求的方式
StringRequest req = new StringRequest(Request.Method.POST,"访问地址",listener,errorListener){
//处理传递的参数
@Override
protected Map getParams() throws AuthFailureError {
Map map = new HashMap();
map.put("uname","admin12");
map.put("upass","1234");
return map;
}
};
//2.将请求放入队列中
queue.add(req);
}
}