Android第三方网络资源加载框架Volley
2015-10-24 21:47
489 查看
Volley的简介和特点
Volley 是2013年发布的Android平台网络通信库: 使用场景 并发,效率 性能地址 :https://android.googlesource.com/platform/frameworks/volley/
Github地址:https://github.com/mcxiaoke/android-volley
优点
1.通信更快,更简单
2.网络请求的排序,优先级处理
3.网络请求的缓存
4.多级别的取消请求
5.扩展性强
缺点
不适合数据的上传和下载
为什么使用Volley
1.高效的Get/Post方式的数据请求交互
2.网络图片加载和缓存
3.谷歌官方推出
4.性能稳定强劲
Volley工作示意图
用法
1.导包(写在buil.gradle文件的dependencies代码块)compile 'com.mcxiaoke.volley:library:1.0.19'
2.创建请求队列
RequestQueue requestQueue = Volley.newRequestQueue(this);
3.创建具体请求
如:
请求String(Json等)
StringRequest request = new StringRequest(url, com.android.volley.Response.Listener<java.lang.String> listener, com.android.volley.Response.ErrorListener errorListener); requestQueue.add(request);
请求图片
ImageLoader imageLoader = new ImageLoader(requestQueue, ImageLoader.ImageCache imageCache); imageLoader.get(URL, ImageLoader.getImageListener(imageView, R.mipmap.ic_launcher, R.mipmap.ic_launcher));
4.取消请求
requestQueue.cancelAll(TAG);
一些相关操作
取消请求:
getRequstQuene().cancelAll()
关闭Cache:
request.setShouldCache()
删除某一URL的Cache删除:
getRequstQuene().getCache().remove(url)
删除所有的Cache:
getRequstQuene().getCache().clear()
示例:
1.导包compile 'com.mcxiaoke.volley:library:1.0.19'
2.布局文件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!"/> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_below="@+id/textView2" android:layout_marginTop="78dp" android:text="New Text"/> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toEndOf="@+id/textView2" android:layout_toRightOf="@+id/textView2" android:src="@mipmap/ic_launcher"/> <com.android.volley.toolbox.NetworkImageView android:id="@+id/networkImageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" /> </RelativeLayout>
3.java代码
1)资源URL和相关定义
public static final String URL_GET = "http://apis.juhe.cn/mobile/get?phone=13812345678&key=daf8fa858c330b22e342c882bcbac622"; public static final String URL_POST = "http://apis.juhe.cn/mobile/get "; public static final String URL_IMG= "http://img2.3lian.com/2014/f7/5/d/22.jpg"; public static String TAG = "QL"; private RequestQueue requestQueue; private TextView textView; private TextView textView1; private ImageView imageView;
2)实例化请求队列
普通的方法
requestQueue = Volley.newRequestQueue(this);
使用工厂的方法,详情请移步最后“请求网络图片”—–> 2.1.2
requestQueue2 = VolleyFactroy.getInstance(this).getRequestQueue();
3)————————–>>>>>
使用Get方式请求Json数据
public void get() { StringRequest request = new StringRequest(URL_GET, new Response.Listener<String>() { @Override//成功的返回 public void onResponse(String response) { textView.setText(response.toString());//将数据取出 } }, new Response.ErrorListener(){ @Override//失败的返回 public void onErrorResponse(VolleyError error) { textView1.setText(error.toString()); } }); request.setTag(TAG);//设置TAG,方便取消请求 requestQueue.add(request);//加入请求队列 }
使用Post方式请求Json数据
public void post(){ StringRequest request = new StringRequest(Request.Method.POST, URL_POST, new Response.Listener<String>() {//设置请求方式为post @Override public void onResponse(String response) { textView.setText(response.toString());//将数据取出 } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { textView1.setText(error.toString()); } }){ @Override//重写getParams()方法,用于包装数据 protected Map<String, String> getParams() throws AuthFailureError { //用map将键值对进行封装 HashMap<String, String> map = new HashMap<>(); map.put("phone", "18977921449"); map.put("key", "daf8fa858c330b22e342c882bcbac622"); return map; } }; request.setTag(TAG); requestQueue.add(request); }
请求网络图片
1.使用自带networkImageView控件显示图片
private void getNetWorkImage() { NetworkImageView networkImageView = (NetworkImageView) findViewById(R.id.networkImageView);//取出networkImageView networkImageView.setDefaultImageResId(R.mipmap.ic_launcher);//设置默认图片 networkImageView.setErrorImageResId(R.mipmap.ic_launcher);//设置加载失败图片 networkImageView.setTag(TAG);//设置tag,方便取消请求 networkImageView.setImageUrl(URL_IMG, new ImageLoader(requestQueue, new ImageLoader.ImageCache() { @Override public Bitmap getBitmap(String url) { return null; } @Override public void putBitmap(String url, Bitmap bitmap) { } })); }
2.使用系统ImageView控件显示图片
2.1创建ImageLoader请求2.1.1一般的imageLoader
ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() { @Override public Bitmap getBitmap(String url) { return null; } @Override public void putBitmap(String url, Bitmap bitmap) { } });
2.1.2使用工厂的imageLoader,使用自定义实例工厂和图片缓存类
用工厂获取对象。得到RequestQueue,避免重复new。得到图片缓存
请向下移步————>>>
2.2绑定给imageView
方式1
imageLoader.get(URL_IMG, new ImageLoader.ImageListener() {//用请求去获取资源 @Override public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { Bitmap bitmap = response.getBitmap();//获取资源 imageView.setImageBitmap(bitmap);//绑定给imageView } @Override public void onErrorResponse(VolleyError error) { } });
方式2
imageLoader.get(URL_IMG, ImageLoader.getImageListener(imageView, R.mipmap.ic_launcher, R.mipmap.ic_launcher));//获取资源并绑定给imageView,设置默认图片、加载失败图片
当程序退出时,在onStop()中取消请求,
@Override protected void onStop() { super.onStop(); if (requestQueue != null){ //取消请求 requestQueue.cancelAll(TAG); requestQueue2.cancelAll(TAG); } }
步骤2.1.2在此
1.工厂类,VolleyFactroy .java
public class VolleyFactroy { private RequestQueue requestQueue; private Context context; private MImgCache imgCache; private VolleyFactroy(Context context) { this.context = context; requestQueue = getRequestQueue(); imgCache = new MImgCache(); } private static VolleyFactroy instance; public static synchronized VolleyFactroy getInstance(Context context) { if (instance == null) instance = new VolleyFactroy(context); return instance; } public RequestQueue getRequestQueue(){ if (requestQueue == null) requestQueue = Volley.newRequestQueue(context.getApplicationContext()); return requestQueue; } public <T> void addRequest(Request<T> request) { getRequestQueue().add(request); } public void cancelRequest(Object tag) { getRequestQueue().cancelAll(tag); } public MImgCache getImgCache() { return imgCache; } }
2.图片缓存类
public class MImgCache extends LruCache<String, Bitmap> implements ImageLoader.ImageCache { private static int MAX_SIZE = 10 * 1024 * 1024;//缓存大小 /** * @param maxSize for caches that do not override {@link #sizeOf}, this is * the maximum number of entries in the cache. For all other caches, * this is the maximum sum of the sizes of the entries in this cache. */ public MImgCache(int maxSize) { super(maxSize); } public MImgCache() { this(MAX_SIZE); } @Override protected int sizeOf(String key, Bitmap value) { return value.getRowBytes() * value.getHeight(); } @Override public Bitmap getBitmap(String url) { return get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { put(url, bitmap); } }
3.使用工厂辅助创建imageLoader
ImageLoader imageLoader = new ImageLoader(requestQueue2,VolleyFactroy.getInstance(this).getImgCache());
附:MainActivity完整代码
import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.volley.AuthFailureError;
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.NetworkImageView;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
public static final String URL_GET = "http://apis.juhe.cn/mobile/get?phone=13812345678&key=daf8fa858c330b22e342c882bcbac622";
public static final String URL_POST = "http://apis.juhe.cn/mobile/get ";
public static final String URL_IMG = "http://img2.3lian.com/2014/f7/5/d/22.jpg";
public static String TAG = "QL";
private TextView textView;
private TextView textView1;
private RequestQueue requestQueue;
private ImageView imageView;
private RequestQueue requestQueue2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.textView);
textView1 = (TextView) findViewById(R.id.textView2);
requestQueue = Volley.newRequestQueue(this);
requestQueue2 = VolleyFactroy.getInstance(this).getRequestQueue();
// get();
// post();
getImg();
}
public void getImg(){
imageView = (ImageView) findViewById(R.id.imageView);
//方法二,自定义实例工厂和缓存类
ImageLoader imageLoader = new ImageLoader(requestQueue2,VolleyFactroy.getInstance(this).getImgCache());
imageLoader.get(URL_IMG, ImageLoader.getImageListener(imageView, R.mipmap.ic_launcher, R.mipmap.ic_launcher));
}
public void getImg3(){
//方法1
ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String url) {
return null;
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
});
imageLoader.get(URL_IMG, ImageLoader.getImageListener(imageView, R.mipmap.ic_launcher, R.mipmap.ic_launcher));
}
private void getImg2() {
ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() { @Override public Bitmap getBitmap(String url) { return null; } @Override public void putBitmap(String url, Bitmap bitmap) { } });
imageLoader.get(URL_IMG, new ImageLoader.ImageListener() {
@Override
public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
Bitmap bitmap = response.getBitmap();
imageView.setImageBitmap(bitmap);
}
@Override
public void onErrorResponse(VolleyError error) {
}
});
}
private void getNetWorkImage() {
NetworkImageView networkImageView = (NetworkImageView) findViewById(R.id.networkImageView);
networkImageView.setDefaultImageResId(R.mipmap.ic_launcher);
networkImageView.setErrorImageResId(R.mipmap.ic_launcher);
networkImageView.setTag(TAG);
networkImageView.setImageUrl(URL_IMG, new ImageLoader(requestQueue, new ImageLoader
.ImageCache() {
@Override
public Bitmap getBitmap(String url) {
return null;
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
}));
}
public void get() {
StringRequest request = new StringRequest(URL_GET, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
textView.setText(response.toString());
}
}, new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
textView1.setText(error.toString());
}
});
request.setTag(TAG);
requestQueue.add(request);
// requestQueue2.add(request);
}
public void post(){
StringRequest request = new StringRequest(Request.Method.POST, URL_POST, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
textView.setText(response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
textView1.setText(error.toString());
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
HashMap<String, String> map = new HashMap<>();
map.put("phone", "18977921449");
map.put("key", "daf8fa858c330b22e342c882bcbac622");
return map;
}
};
request.setTag(TAG);
requestQueue.add(request);
}
@Override protected void onStop() { super.onStop(); if (requestQueue != null){ //取消请求 requestQueue.cancelAll(TAG); requestQueue2.cancelAll(TAG); } }
}
工厂类方法在此部分的上面 ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories