6

Android网络请求(4) 网络请求框架Volley - 高同学,你好

 1 year ago
source link: https://www.cnblogs.com/nhgtx/p/16918545.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Android网络请求(4) 网络请求框架Volley

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'

Get请求

// 请求地址 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请求

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请求

Put请求就不说了,只需要修改请求方法即可

Delete请求

delete请求如果需要携带参数,可以在post请求的基础上修改请求方法,如果不携带参数可以在get请求的基础上添加请求方法。

Json数据请求

我们注意到了,我们返回的都是String类型的值,我们日常开发中返回的值大多数时json格式的,那么我们怎么样去请求json数据呢。Volley提供了JsonObjectRequest和JsonArrayRequest这两个类可用于返回json数据。它的使用方法和StringRequest是一样的,只需要修改一些参数即可。另外他不在需要通过重写方法来传递参数,可以直接将你需要的参数转换成json格式,在实例化JsonObjectRequest时传入

Get请求

// 请求地址 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基础上修改请求方法即可

delete

判断是否携带参数并且post或get中修改即可

网络图片加载框架

1、通过ImageRequest请求网络图片

这种方法是通过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);

2、通过Imageloader加载图片

这种方法对比起上一种来说要更加复杂一些,我们需要先新建一个类实现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);

3、通过NetworkImageView加载图片

除了使用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框架是单纯的请求数据还是加载图片都要记住,它不适合体量较大的网络请求。

以上三种加载网络图片的方式最终都能得到成果图

3034026-20221123154614995-1775178653.png

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK