Volley网络请求框架总结,java,kotlin

本文介绍了Volley网络请求框架的特性,如自动调度、内存和磁盘缓存,并提供了添加Volley到项目、发送简单请求及取消请求的示例。Volley适合小数据量的频繁请求,适用于填充UI的RPC类型操作,对于大型下载则需寻找替代方案。文章还探讨了自定义请求的实现,包括parseNetworkResponse和deliverResponse方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说两句

现在很多人都说volley已经过时了,因为现在主流的就是OKhttp和retrofit以及dragger2了,框架是主流的MVP框架,使用这些网络请求库更优良,这段时间刚好有空,想整理一下,我的理解里,没有过时不过时,没有哪个好,哪个不好,技术是用来解决实际问题的,有诸多的选择的时候,一定有一个最适合当前问题的解决方案,因为每一个工具都有其特点、优势、劣势,那些淘汰掉的是因为有更方便更优良的新生代出来了,我的项目目前使用的是volley网络框架,我先对这个网络框架进行一下总结,对于其他的网络框架还没有很多的研究,不敢多说是非,后续有了比较深入的研究再写个帖子说两句,也欢迎各位朋友指点批评。。。。

介绍&地址

volley是google官方推出的http网络请求库。
话不多说,先来官方资料,贴出官方地址:

  1. volley的GitHub地址https://github.com/google/volley
  2. volley的官方使用介绍地址 https://developer.android.com/training/volley/ (此处需要科学上网才可以访问,你懂得)

volley的特点

volley最主要的特点是:
体积小、速度快,非常适合小数据量的频繁请求;
当然不适合大型下载或流媒体操作,
然而volley也对于这种它不适合的也给出了解决办法,
使用DownloadManager替代。

特点

  • 自动调度网络请求。
  • 多个并发网络连接。
  • 具有标准HTTP 缓存一致性的透明磁盘和内存响应缓存 。
  • 支持请求优先级。
  • 取消请求API。您可以取消单个请求,也可以设置要取消的请求块或范围。
  • 易于定制,例如,重试和退避。
  • 强大的排序,可以使用从网络异步获取的数据轻松正确填充UI。
  • 调试和跟踪工具。
    怎么样是不是有的看不懂什么意思?说实话其实我也是,哥们别着急,继续看。

响应回调,支持原始字符串,图像和JSON。

Volley擅长用于填充UI的RPC类型操作,例如将搜索结果页面作为结构化数据获取。
Volley不适合大型下载或流媒体操作,因为Volley在解析期间将所有响应保存在内存中。对于大型下载操作,请考虑使用类似的替代方法DownloadManager

添加volley到项目中

Volley添加到项目的最简单方法是将以下依赖项添加到应用程序的build.gradle文件中:
方式1

dependencies {
    ...
    compile 'com.android.volley:volley:1.1.1'
}

使用implementation替换compile,因为从2018年底开始Google已经要删除这个关键字了,统一使用implementation

方式2
1,Git通过在命令行键入以下内容来克隆存储库:

git clone https://github.com/google/volley

2,将下载的源作为Android库模块导入到应用项目中如何创建android库模块,后续再写一篇帖子说

发送简单的请求

可以通过创建RequestQueue并传递 Request对象来使用Volley 。在RequestQueue管理诸多的网络请求子线程(网络请求属于耗时操作,是必须放在子线程的),这个队列负责网络请求子线程的网络请求操作、读取和写入到缓存中,解析响应管理工作线程等内容。Requests负责解析原始响应,Volley负责将解析后的响应分发回主线程以进行传递。

  • 要使用Volley,必须不能忘记将android.permission.INTERNET权限添加 到应用的清单中。如果没有这个,应用将无法连接到网络。-

发送一个请求使用Volley.newRequestQueue方法,向这个方法中传入Request对象,以发起网络请求,RequestQueue可以不进行设置,直接使用默认值也可以启动队列;
先说发起一个网络请求的套路,稍后再说这个发起请求必须用到的这个RequestQueue

kotlin发起网络请求example

val textView = findViewById<TextView>(R.id.text)
// ...

// Instantiate the RequestQueue.
val queue = Volley.newRequestQueue(this)
val url = "http://www.google.com"

// Request a string response from the provided URL.
val stringRequest = StringRequest(Request.Method.GET, url,
        Response.Listener<String> {
    response ->
            // Display the first 500 characters of the response string.
            textView.text = "Response is: ${
     response.substring(0, 500)}"
        },
        Response.ErrorListener {
    textView.text = "That didn't work!" })

// Add the request to the RequestQueue.
queue.add(stringRequest)

java发起网络请求example

final TextView mTextView = (TextView) findViewById(R.id.text);
// ...

// Instantiate the RequestQueue.
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://www.google.com";

// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
   
    @Override
    public void onResponse(String response) {
   
        // Display the first 500 characters of the response string.
        mTextView.setText("Response is: "+ response.substring(0,500));
    }
}, new Response.ErrorListener() {
   
    @Override
    public void onErrorResponse(VolleyError error) {
   
        mTextView.setText("That didn't work!");
    }
});

// Add the request to the RequestQueue.
queue.add(stringRequest);

Volley总是在主线程上提供已解析的响应。在主线程上运行可以方便地使用接收到的数据更新填充UI控件,因为可以直接从handler响应修改UI控件,

发送请求分析

要发送请求,只需构建一个请求并将其添加到RequestQueue使用 add()方法,就可以将这个请求添加进队列。添加请求后,它将在队列的管道中移动,获得服务,解析并传递其原始响应。
当调用add()时,Volley运行一个缓存处理线程和一个网络调度线程池。当向队列添加请求时,它会被缓存线程拾取并进行分类:如果请求可以从缓存中获得服务,则缓存响应将在缓存线程上进行解析,并且解析后的响应将在主线程上传递。如果无法从缓存中为请求提供服务,则将其置于网络队列中。第一个可用的网络线程从队列中获取请求,执行HTTP事务,解析工作线程上的响应,将响应写入缓存,并将解析的响应发送回主线程以进行传递。

注意,I / O阻塞、解析/解码等昂贵的操作是在工作线程上完成的。可以从任何线程添加请求,但响应始终在主线程上传递。
在这里插入图片描述
以上是volley发起网络请求的生命周期。

取消网络请求

要取消请求,通过Request对象调用cancel()方法完成。一旦取消,Volley保证永远不会调用当前http请求线程的响应handler。可以在activity的onstop()方法中直接取消所有待处理的请求。而不用做getActivity() == null或者onSaveInstanceState()是否已经执行等检查操作后再取消待处理的请求。
要利用此行为,您通常必须跟踪所有正在进行的请求,以便能够在适当的时间取消它们。有一种更简单的方法: 可以将标记对象与每个请求相关联。然后,您可以使用此标记提供取消请求的范围。
例如,您可以将所有请求标记为Activity代表他们发出的请求,在onStop()方法中执行requestQueue.cancelAll(this)表示取消当前activity的所有待处理的请求。
同样,可以在ViewPager选项卡中使用各自的选项卡标记所有缩略图图像请求, 并在滑动时取消已经划过去的选项卡页面的待处理请求,以确保新选项卡不会被另一个选项卡的请求阻止阻塞。

使用标记的字符串值的示例:

1,定义标记并将其添加到您的请求中。
kotlin:

val TAG = "MyTag"
val stringRequest: StringRequest // Assume this exists.
val requestQueue: RequestQueue? // Assume this exists.

// Set the tag on the request.
stringRequest.tag = TAG

// Add the request to the RequestQueue.
requestQueue?.add(stringRequest)

java:

public static final String TAG = "MyTag";
StringRequest stringRequest; // Assume this exists.
RequestQueue mRequestQueue;  // Assume this exists.

// Set the tag on the request.
stringRequest.setTag(TAG);

// Add the request to the RequestQueue.
mRequestQueue.add(stringRequest);

2,在活动的onStop()方法中,取消所有具有此标记的请求。
kotlin:

protected fun onStop() {
   
    super.onStop()
    requestQueue?.cancelAll(TAG)
}

java:

@Override
protected void onStop () {
   
    super.onStop(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值