UploadDataProvider

public abstract class UploadDataProvider implements Closeable


抽象类,允许嵌入器向 UrlRequest 提供上传正文。它支持非分块(大小已知)和分块(大小未知)上传。请注意,并非所有服务器都支持分块上传。

如果数据最终发送多次,则上传始终是分块的(跨多个上传),否则永远不会分块。

摘要

公共构造函数

公共方法

void

当请求不再需要此 UploadDataProvider 时调用,以便可以显式释放资源(例如文件)。

abstract long

如果这是非分块上传,则返回上传的长度。

abstract void
read(UploadDataSink uploadDataSink, ByteBuffer byteBuffer)

将上传数据读取到 byteBuffer 中。

abstract void
rewind(UploadDataSink uploadDataSink)

将上传数据倒回到开头。

公共构造函数

UploadDataProvider

public UploadDataProvider()

公共方法

close

public void close()

当请求不再需要此 UploadDataProvider 时调用,以便可以显式释放资源(例如文件)。

抛出
java.io.IOException

如果在该过程中发生任何 IOException。如果请求尚未完成,这将导致请求失败;否则,系统会记录该请求。

getLength

public abstract long getLength()

如果这是非分块上传,则返回上传的长度。如果是分块上传,则必须始终返回 -1。

返回
long

非分块上传的上传长度,否则为 -1。

抛出
java.io.IOException

如果在该过程中发生任何 IOException。

read

public abstract void read(UploadDataSink uploadDataSink, ByteBuffer byteBuffer)

将上传数据读取到 byteBuffer 中。完成后,缓冲区的指针会更新为读取的字节的末尾。缓冲区的限制不会更改。每次调用此方法后,都必须对 uploadDataSink 进行一次调用(同步或异步):成功时调用 onReadSucceeded,失败时调用 onReadError。在调用其中一个方法之前,不会调用读取或倒回。即使取消了关联的 UrlRequest,也必须先调用其中一个方法,然后才能安全地释放资源。抛出异常也会导致释放资源并导致请求出错。

注意:对于非分块上传,只有在读取成功且至少有一个字节已读取到 byteBuffer 中时,才应调用 onReadSucceeded。对于分块上传(数据大小未知),允许使用空字节缓冲区为最后一个分块调用 onReadSucceeded

参数
UploadDataSink uploadDataSink

读取完成后要通知的对象。

ByteBuffer byteBuffer

用于将读取的字节复制到其中的缓冲区。请勿更改 byteBuffer 的限制。

抛出
java.io.IOException

如果在该过程中发生任何 IOException。系统将调用 onFailed,并将抛出的异常设置为 CallbackException 的原因。

rewind

public abstract void rewind(UploadDataSink uploadDataSink)

将上传数据倒回到开头。当 Cronet 需要上传数据提供程序处于与尚未调用 read 时等效的状态时调用。

为了表明操作已完成,此函数的实现必须调用 onRewindSucceeded 以表明成功,或调用 onRewindError 以表明失败。即使取消了关联的 UrlRequest,也必须先调用其中一个方法,然后才能安全地释放资源。从该方法抛出异常等同于调用 onRewindError。如果不支持倒回(例如,从一次性流读取),则应立即调用 onRewindError

实现者可以安全地假设,在他们通知接收器倒回已完成之前,既不会发出 read,也不会发出并发 rewind 调用,如上一段所述。

如果需要多次上传正文,Cronet 会在内部使用此方法。这可能会在许多不同的情况下发生,例如在遵循重定向时,或在超时或网络断开连接后重试请求时。请注意,虽然实现倒回通常是可选的,但最终需要倒回的请求将失败,除非实现了倒回。

参数
UploadDataSink uploadDataSink

倒回操作完成(成功或其他)后要通知的对象。

抛出
java.io.IOException

如果在该过程中发生任何 IOException。系统将调用 onFailed,并将抛出的异常设置为 CallbackException 的原因。