UploadDataProvider

public abstract class UploadDataProvider implements Closeable


Lớp trừu tượng cho phép trình nhúng cung cấp nội dung tải lên cho UrlRequest. Thư viện này hỗ trợ cả tải lên không phân đoạn (đã biết trước kích thước) và tải lên phân đoạn (chưa biết trước kích thước). Xin lưu ý rằng không phải máy chủ nào cũng hỗ trợ tải lên theo khối.

Tệp tải lên luôn được chia thành các phần, trên nhiều lượt tải lên nếu dữ liệu được gửi nhiều lần hoặc không bao giờ được chia thành các phần.

Tóm tắt

Hàm khởi tạo công khai

Phương thức công khai

void

Được gọi khi một yêu cầu không còn cần UploadDataProvider này nữa, để các tài nguyên (chẳng hạn như tệp) có thể được giải phóng một cách rõ ràng.

abstract long

Nếu đây là một tệp tải lên không phân đoạn, thì phương thức này sẽ trả về độ dài của tệp tải lên.

abstract void
read(UploadDataSink uploadDataSink, ByteBuffer byteBuffer)

Đọc dữ liệu tải lên vào byteBuffer.

abstract void
rewind(UploadDataSink uploadDataSink)

Tua dữ liệu tải lên về đầu.

Hàm khởi tạo công khai

UploadDataProvider

public UploadDataProvider()

Phương thức công khai

đóng

public void close()

Được gọi khi một yêu cầu không còn cần UploadDataProvider này nữa, để các tài nguyên (chẳng hạn như tệp) có thể được giải phóng một cách rõ ràng.

Gửi
java.io.IOException

nếu có IOException xảy ra trong quá trình này. Điều này sẽ khiến yêu cầu không thành công nếu chưa hoàn tất; nếu không, yêu cầu sẽ được ghi lại.

getLength

public abstract long getLength()

Nếu đây là một tệp tải lên không phân đoạn, thì phương thức này sẽ trả về độ dài của tệp tải lên. Phải luôn trả về -1 nếu đây là một tệp tải lên được chia thành nhiều phần.

Giá trị trả về
long

độ dài của tệp tải lên đối với các tệp tải lên không phân đoạn, nếu không thì là -1.

Gửi
java.io.IOException

nếu có IOException xảy ra trong quá trình này.

đọc

public abstract void read(UploadDataSink uploadDataSink, ByteBuffer byteBuffer)

Đọc dữ liệu tải lên vào byteBuffer. Sau khi hoàn tất, vị trí của vùng đệm sẽ được cập nhật thành cuối cùng của các byte đã đọc. Giới hạn của vùng đệm không thay đổi. Mỗi lệnh gọi của phương thức này phải được theo sau bằng một lệnh gọi duy nhất, có thể đồng bộ hoặc không đồng bộ, đến uploadDataSink: onReadSucceeded khi thành công hoặc onReadError khi thất bại. Không có thao tác đọc hay tua lại nào được gọi cho đến khi một trong các phương thức đó hoặc phương thức còn lại được gọi. Ngay cả khi UrlRequest được liên kết bị huỷ, bạn vẫn phải gọi một trong hai trước khi có thể giải phóng tài nguyên một cách an toàn. Việc gửi một ngoại lệ cũng sẽ dẫn đến việc giải phóng tài nguyên và yêu cầu bị lỗi.

Lưu ý: Đối với các lượt tải lên không phân đoạn, bạn chỉ nên gọi onReadSucceeded khi quá trình đọc đã thành công và ít nhất một byte đã được đọc vào byteBuffer. Đối với các tệp tải lên theo khối (Chưa biết kích thước dữ liệu), bạn có thể gọi onReadSucceeded cho khối cuối cùng bằng vùng đệm byte trống.

Tham số
UploadDataSink uploadDataSink

Đối tượng cần thông báo khi quá trình đọc hoàn tất.

ByteBuffer byteBuffer

Vùng đệm để sao chép các byte đã đọc vào. Đừng thay đổi giới hạn của byteBuffer.

Gửi
java.io.IOException

nếu có IOException xảy ra trong quá trình này. onFailed sẽ được gọi với ngoại lệ đã khai báo được đặt làm nguyên nhân của CallbackException.

tua lại

public abstract void rewind(UploadDataSink uploadDataSink)

Tua dữ liệu tải lên về đầu. Được gọi khi Cronet yêu cầu trình cung cấp dữ liệu tải lên ở trạng thái tương đương như thể read chưa bao giờ được gọi.

Để báo hiệu rằng thao tác đã hoàn tất, các phương thức triển khai của hàm này phải gọi onRewindSucceeded để cho biết thành công hoặc onRewindError khi thất bại. Ngay cả khi UrlRequest được liên kết bị huỷ, bạn vẫn phải gọi một trong hai trước khi có thể giải phóng tài nguyên một cách an toàn. Việc gửi một trường hợp ngoại lệ từ phương thức này tương đương với việc gọi onRewindError. Nếu không hỗ trợ tua lại (ví dụ: nếu đọc từ một luồng phát một lần), thì thao tác này sẽ gọi ngay onRewindError.

Người triển khai có thể giả định một cách an toàn rằng cả read và lệnh gọi rewind đồng thời sẽ không được phát hành cho đến khi chúng thông báo cho sink rằng quá trình tua lại đã hoàn tất, như mô tả trong đoạn trước.

Phương thức này được Cronet sử dụng nội bộ nếu phần nội dung cần được tải lên nhiều lần. Điều này có thể xảy ra trong nhiều tình huống khác nhau, chẳng hạn như khi theo lệnh chuyển hướng hoặc khi thử lại các yêu cầu sau khi hết thời gian chờ hoặc ngắt kết nối mạng. Xin lưu ý rằng mặc dù việc triển khai tính năng tua lại thường là không bắt buộc, nhưng những yêu cầu cần đến tính năng này sẽ không thành công trừ phi bạn triển khai tính năng tua lại.

Tham số
UploadDataSink uploadDataSink

Đối tượng cần thông báo khi thao tác tua lại hoàn tất, dù thành công hay không.

Gửi
java.io.IOException

nếu có IOException xảy ra trong quá trình này. onFailed sẽ được gọi với ngoại lệ đã khai báo được đặt làm nguyên nhân của CallbackException.