fan*_*fox 1 android android-asynctask retrofit
我正在尝试将多个图像上传到服务器并通过 Asynctask 将它们一张一张地发送。上传图像后,我将 URL 保存到本地列表并将其发送到 onPostExecute 中进行处理。但是,我遇到了问题,因为 onPostExecute 触发得太早并且 doInBackground 只返回空列表。
将 URI 传递给 Asynctask
new UploadImages().execute(arrayUri);
Run Code Online (Sandbox Code Playgroud)
我的异步任务
private class UploadImages extends AsyncTask<Uri,Void,List<String>>{
@Override
protected List<String> doInBackground(Uri... params) {
final ArrayList<String> urlList = new ArrayList<>();
for(Uri uri : params) {
File file = new File(uri.getPath());
RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"), file);
MultipartBody.Part body = MultipartBody.Part.createFormData("image", file.getName(), requestBody);
RequestBody folderName = RequestBody.create(MediaType.parse("text/plain"), folder);
ApiEndpointInterface apiEndpointInterface = RetrofitManager.getApiInterface();
Call<FileInfo> call4File = apiEndpointInterface.postFile(body, folderName);
call4File.enqueue(new ApiCallback<FileInfo>() {
@Override
protected void do4Failure(Throwable t) {
Log.d(TAG, t.toString());
snackbar = Snackbar.make(newIncidentLayout, R.string.sb_image_upload_error, Snackbar.LENGTH_SHORT);
snackbar.show();
}
@Override
protected void do4PositiveResponse(Response<FileInfo> response) {
FileInfo fileDetails = response.body();
urlList.add(fileDetails.getImage());
Log.d(TAG, "Uploaded Image");
}
@Override
protected void do4NegativeResponse(Response<FileInfo> response) {
String bodyMsg = "";
try {
bodyMsg = new String(response.errorBody().bytes());
} catch (IOException e) {
e.printStackTrace();
}
Log.d(TAG, bodyMsg);
snackbar = Snackbar.make(newIncidentLayout, R.string.sb_image_upload_error, Snackbar.LENGTH_SHORT);
snackbar.show();
}
});
}
return urlList;
}
@Override
protected void onPostExecute(List<String> urlList) {
super.onPostExecute(urlList);
//Post Incident
setProgressMessage("Posting incident...");
//other code here
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试添加 thread.sleep 但结果永远不会相同。有时我会得到一份清单作为回报,有时什么也没有发生。
我不知道为什么会发生这种情况。我希望你可以帮助我。谢谢。
在 android 中,默认情况下,retrofit 调用是在后台线程中进行的。你不应该/不需要使用AsyncTask.
您可以为改造回调的onPostExecute方法onResponse(或在您的情况下do4PositiveResponse和)内部编写代码。do4NegativeResponse
| 归档时间: |
|
| 查看次数: |
2924 次 |
| 最近记录: |