Retrofit 内 AsyncTask 中的 onPostExecute 触发得太早

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 但结果永远不会相同。有时我会得到一份清单作为回报,有时什么也没有发生。

我不知道为什么会发生这种情况。我希望你可以帮助我。谢谢。

Nab*_*ari 5

在 android 中,默认情况下,retrofit 调用是在后台线程中进行的。你不应该/不需要使用AsyncTask.

您可以为改造回调的onPostExecute方法onResponse(或在您的情况下do4PositiveResponse和)内部编写代码。do4NegativeResponse