- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
Volley是Google在2013年5月15日到17日在旧金山Moscone中心举办网络开发者年会中推出的Android异步网络加载框架和图片加载框架,它特别适合数据体量小且通讯频繁的网络操作场景,而Android开发中大多数场景都是这样的,但是如果让它去进行文件上传下载之类的大数据量网络操作,那么他的表现将非常差.
那么让我们走进Volley,来熟悉一下它最基本的使用吧。值得一提的是,Volley提供了一个图片加载框架NetworkImageView,我们也来一起了解一下吧.
Volley的历史不短,但是它的修改却很少,现在最高的版本也才1.2.1。我们使用的是1.1.1版本,现在build.gradle(app)中的dependencies中导入依赖 。
implementation group: 'com.android.volley', name: 'volley', version: '1.1.1'
// 请求地址
String src = "https://www.baidu.com";
// 创建请求队列
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
// 创建请求
StringRequest request = new StringRequest(src, new com.android.volley.Response.Listener<String>() {
@Override
public void onResponse(String response) {//成功时返回的response数据
String s = response.toString();
System.out.println(s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {//失败时返回的error信息
String message = error.getMessage();
System.out.println(message);
}
});
// 将请求添加至队列中,否则不会发起请求
requestQueue.add(request);
直接在MainActivity中进行网络请求,这与我们之前的方式不太一样,这是因为Volley请求代码比OkHtpp还要简短,监听都可以new+空格+回车 自动弹出,我们只需要管理返回的数据即可,而且创建的请求队列并不只能使用一次,这是一个队列,可以加入多个请求,所以,我们只需要创建请求并且导入到这个队列中即可.
post请求比get请求多一些参数,首先就是在创建请求时要去指定请求为post,因为默认请求时get,其次需要重写一个方法用于传递post请求所携带的参数,如果不这么做的话,就会报错.
// 请求地址
String src = "https://xxx.xxx.com";
// 创建请求队列
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
// 创建请求,添加请求类型
StringRequest request = new StringRequest(Request.Method.POST ,src, new com.android.volley.Response.Listener<String>() {
@Override
public void onResponse(String response) {//成功时返回的response数据
String s = response.toString();
System.out.println(s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {//失败时返回的error信息
String message = error.getMessage();
System.out.println(message);
}
}){
// post请求一定要传入参数否则报错
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<>();
map.put("username","123456");
map.put("password","123456");
return map;
}
};
// 将请求添加至队列中,否则不会发起请求
requestQueue.add(request);
Put请求就不说了,只需要修改请求方法即可 。
delete请求如果需要携带参数,可以在post请求的基础上修改请求方法,如果不携带参数可以在get请求的基础上添加请求方法.
我们注意到了,我们返回的都是String类型的值,我们日常开发中返回的值大多数时json格式的,那么我们怎么样去请求json数据呢。Volley提供了JsonObjectRequest和JsonArrayRequest这两个类可用于返回json数据。它的使用方法和StringRequest是一样的,只需要修改一些参数即可。另外他不在需要通过重写方法来传递参数,可以直接将你需要的参数转换成json格式,在实例化JsonObjectRequest时传入 。
// 请求地址
String src = "https://www.baidu.com";
// 创建请求队列
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
// 创建请求,添加请求类型
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET,src,null, new com.android.volley.Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {//成功时返回的response数据
String s = response.toString();
System.out.println(s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {//失败时返回的error信息
String message = error.getMessage();
System.out.println(message);
}
});
// 将请求添加至队列中,否则不会发起请求
requestQueue.add(request);
// 请求地址
String src = "https://www.baidu.com";
// 创建请求队列
RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
// 创建参数
JSONObject data = new JSONObject();
try {
data.put("username","123");
data.put("password","123");
} catch (JSONException e) {
e.printStackTrace();
}
// 创建请求,添加请求类型
// 顺序是 请求方法 请求地址 请求携带的数据 监听器
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST,src,data, new com.android.volley.Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {//成功时返回的response数据
String s = response.toString();
System.out.println(s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {//失败时返回的error信息
String message = error.getMessage();
System.out.println(message);
}
});
// 将请求添加至队列中,否则不会发起请求
requestQueue.add(request);
在post基础上修改请求方法即可 。
判断是否携带参数并且post或get中修改即可 。
这种方法是通过ImageRequest来请求一张图片转换为Bitmap格式,在返回的Bitmap中对ImageView进行设置图片,较为简单.
img = (ImageView) findViewById(R.id.img);
// 创建链接
String url = "图片链接";
// 创建队列
RequestQueue requestQueue = Volley.newRequestQueue(this);
// 创建图片请求
ImageRequest imageRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
img.setImageBitmap(response);
}
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
// 添加进队列
requestQueue.add(imageRequest);
这种方法对比起上一种来说要更加复杂一些,我们需要先新建一个类实现ImageLoader.ImageCache接口 。
public class BitmapCache implements ImageLoader.ImageCache{
private LruCache<String, Bitmap> mCache;
public BitmapCache() {
//设置图片最大值
int maxSize = 10*1024;
mCache = new LruCache<String, Bitmap>(maxSize){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url,bitmap);
}
}
然后再去MainActivity中去创建ImageLoader,它不需要我们去设置图片,只需要将图片作为一个参数传递进去,它会帮我们自动加载进ImageView中.
img = (ImageView) findViewById(R.id.img);
// 创建链接
String url = "图片链接";
// 创建队列
RequestQueue requestQueue = Volley.newRequestQueue(this);
// 创建图片请求
ImageLoader imageLoader = new ImageLoader(requestQueue, new BitmapCache());
// 设置图片加载监听,设置默认图片和加载错误图片
ImageLoader.ImageListener imageListener = imageLoader.getImageListener(img,R.drawable.edittext_bg,R.drawable.ic_home_black_24dp);
// 发起请求
imageLoader.get(url,imageListener);
除了使用ImageView加载图片,Volley还提供了一个组件就是NetworkImageView,我们在布局文件上使用它.
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.android.volley.toolbox.NetworkImageView>
它同样需要前面的BitmapCache类,因为他也需要ImageLoder.
img = (NetworkImageView) findViewById(R.id.img);
// 创建链接
String url = "图片地址";
// 创建队列
RequestQueue requestQueue = Volley.newRequestQueue(this);
// 创建一个ImageLoader
ImageLoader imageLoader = new ImageLoader(requestQueue, new BitmapCache());
// 默认图片和异常图片设置
img.setDefaultImageResId(R.drawable.ic_home_black_24dp);
img.setErrorImageResId(R.drawable.ic_home_black_24dp);
// 加载图片
img.setImageUrl(url,imageLoader);
不管你使用的是Volley框架是单纯的请求数据还是加载图片都要记住,它不适合体量较大的网络请求.
以上三种加载网络图片的方式最终都能得到成果图 。
最后此篇关于Android网络请求(4)网络请求框架Volley的文章就讲到这里了,如果你想了解更多关于Android网络请求(4)网络请求框架Volley的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我目前正在测试 Volley 库。但是当请求失败 (404) 时,它不会再次执行,或者至少没有错误。但是缺少数据。如果请求失败,这是重试请求的正确方法吗? 提前致谢 req.setRetryPolic
我是新来从事Volley和缓存工作的:P。尽管我已经看过许多与Volley进行图像缓存有关的文章和帖子,但是我仍然不清楚采用Volley进行图像缓存的最佳/首选方式。像磁盘缓存还是内存? Volley
我想使用 Volley 从我的 Android 应用发送请求。 我已经把它包含在 build.gradle 中了 dependencies { ... compile 'com.andr
我的目标是从另一个类调用 Volley,这是一种非常简洁、模块化的方式,即: VolleyListener newListener = new VolleyListener()
我的代码是: class MyService extends Service{ public void onCreate(){ new ImageLoader(mReque
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我需要帮助来解决 Volley 库错误。我已使用 nodejs api 向服务器发送一些凭据以进行用户注册。在成功的情况下,当我的所有凭据对于创建新用户帐户都是唯一的时,它会向我显示所有响应等的所有内
我正在尝试完善我的应用程序中的错误处理,但我找不到 Volley 触发某些错误的集中位置以及原因。例如,我想知道如果我的请求的状态代码是 500 或更大,它肯定会触发 ServerError,但我似乎
当我在调试器中运行该方法时,数据按预期显示,但是每当我尝试使用它执行任何操作时,parentObject 的值都会返回为 null。 我只是想从服务器获取响应并将其存储为 JSONObject 以便在
我正在使用 Android Volley 缓存请求,这在我使用 GET 时工作正常,但由于某些原因我改用 POST。现在我想用不同的 POST 数据缓存相同的 URL。 请求 1 -> URL1,PO
我的情况是使用 Android-volley至 POST我的 json 对象,我可以成功发布所有内容,我的数据在服务器中可见,但服务器响应为 String不像 json ,这就是出现错误的原因。 co
我正在使用 volley 从 REST api 解析电影详细信息,并将解析的数据保存在名为 detailsMovies 的对象数组列表中。但是我无法在 onResponse 方法之外访问 ArrayL
我想知道如何解决这个问题。已完成代码的研究和替换,但问题仍然存在。 这是我使用 volley 的代码。 private void Regist(){ loading.setVisibility
如何创建一个单独的类,在其中定义所有关于 volley在另一个 Activity 中,我们直接传递 URL、CONTEXT 和 Get Response... 最佳答案 首先在Activity中创建回
我正在使用 volley 库并以 XML 格式获取响应。我想知道我们如何使用/volley 库解析响应。谢谢。 最佳答案 StringRequest req = new StringReque
当我在android studio中搜索 Volley 时,同时获取com.mcxiaoke.volley:library:1.0.19和com.mcxiaoke.volley:library-aar
我是 volley 和 android 的新手,我已经用 gradle 安装了 volley 并做了与官方教程相同的操作。但是没有响应,这意味着 Errorlistener 和 Responselis
当我在 Volley 中发出请求时,我收到 com.android.volley.ServerError 和响应代码 400。 我正在做这样的事情(通用示例代码): final String para
我引用了http://www.androidhive.info/2016/02/android-push-notifications-using-gcm-php-mysql-realtime-chat
当我将以下行添加到依赖项的 build.gradle 行时,Android Studio 显示此错误消息:compile 'com.android.volley:volley:1.0.0' apply
我是一名优秀的程序员,十分优秀!