代码之家  ›  专栏  ›  技术社区  ›  fandomfox

改造内部的AsyncTask中的onPostExecute启动得太早

  •  1
  • fandomfox  · 技术社区  · 7 年前

    我正在尝试将多个图像上载到服务器,并通过Asynctask逐个发送它们。上传图像后,我将url保存到本地列表,并将其发送到onPostExecute中进行处理。但是,我遇到了一些问题,因为onPostExecute启动得太早,doInBackground只返回一个空列表。

    将URI传递给异步任务

    new UploadImages().execute(arrayUri);
    

    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
            }
        }
    

    我尝试添加一个线程。但是结果却不一样。有时我会得到一份清单作为回报,其他时候什么都没发生。

    我不知道为什么会这样。我希望你能帮助我。谢谢

    2 回复  |  直到 7 年前
        1
  •  5
  •   Nabin Bhandari    7 年前

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

    onPostExecute 方法内部 onResponse (或者在你的情况下 do4PositiveResponse do4NegativeResponse )您的改装回调。

        2
  •  1
  •   Muhammad Saad Rafique    7 年前

    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();
                        }
                    });
                }
    

    在这之后,您在onPostExecute中所做的是在for循环完成后进行。