gpt4 book ai didi

android - 通过 Retrofit 2 上传图片时是否可以显示进度条?

转载 作者:IT老高 更新时间:2023-10-28 13:14:26 26 4
gpt4 key购买 nike

我目前正在使用 Retrofit 2,我想在我的服务器上上传一些照片。我知道,旧版本使用 TypedFile 类进行上传。如果我们想使用进度条,我们应该重写 TypedFile 类中的 writeTo 方法。

使用 retrofit 2 库时是否可以显示进度?

最佳答案

首先,你应该使用Retrofit 2 等于或高于2.0 beta2 的版本。二、新建类扩展RequestBody:

public class ProgressRequestBody extends RequestBody {
private File mFile;
private String mPath;
private UploadCallbacks mListener;
private String content_type;

private static final int DEFAULT_BUFFER_SIZE = 2048;

public interface UploadCallbacks {
void onProgressUpdate(int percentage);
void onError();
void onFinish();
}

Take note, I added content type so it can accommodate other types aside image

public ProgressRequestBody(final File file, String content_type,  final  UploadCallbacks listener) {
this.content_type = content_type;
mFile = file;
mListener = listener;
}



@Override
public MediaType contentType() {
return MediaType.parse(content_type+"/*");
}

@Override
public long contentLength() throws IOException {
return mFile.length();
}

@Override
public void writeTo(BufferedSink sink) throws IOException {
long fileLength = mFile.length();
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
FileInputStream in = new FileInputStream(mFile);
long uploaded = 0;

try {
int read;
Handler handler = new Handler(Looper.getMainLooper());
while ((read = in.read(buffer)) != -1) {

// update progress on UI thread
handler.post(new ProgressUpdater(uploaded, fileLength));

uploaded += read;
sink.write(buffer, 0, read);
}
} finally {
in.close();
}
}

private class ProgressUpdater implements Runnable {
private long mUploaded;
private long mTotal;
public ProgressUpdater(long uploaded, long total) {
mUploaded = uploaded;
mTotal = total;
}

@Override
public void run() {
mListener.onProgressUpdate((int)(100 * mUploaded / mTotal));
}
}
}

Third, create the interface

@Multipart
@POST("/upload")
Call<JsonObject> uploadImage(@Part MultipartBody.Part file);

/* JsonObject above can be replace with you own model, just want to make this notable. */

Now you can get progress of your upload. In your activity (or fragment):

class MyActivity extends AppCompatActivity implements ProgressRequestBody.UploadCallbacks {

ProgressBar progressBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

progressBar = findViewById(R.id.progressBar);

ProgressRequestBody fileBody = new ProgressRequestBody(file, this);
MultipartBody.Part filePart =

MultipartBody.Part.createFormData("image", file.getName(), fileBody);

Call<JsonObject> request = RetrofitClient.uploadImage(filepart);

request.enqueue(new Callback<JsonObject>() {
@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
if(response.isSuccessful()){
/* Here we can equally assume the file has been downloaded successfully because for some reasons the onFinish method might not be called, I have tested it myself and it really not consistent, but the onProgressUpdate is efficient and we can use that to update our progress on the UIThread, and we can then set our progress to 100% right here because the file already downloaded finish. */
}
}

@Override
public void onFailure(Call<JsonObject> call, Throwable t) {
/* we can also stop our progress update here, although I have not check if the onError is being called when the file could not be downloaded, so I will just use this as a backup plan just in case the onError did not get called. So I can stop the progress right here. */
}
});

}

@Override
public void onProgressUpdate(int percentage) {
// set current progress
progressBar.setProgress(percentage);
}

@Override
public void onError() {
// do something on error
}

@Override
public void onFinish() {
// do something on upload finished,
// for example, start next uploading at a queue
progressBar.setProgress(100);
}

}

关于android - 通过 Retrofit 2 上传图片时是否可以显示进度条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33338181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com