onPostExecute方法在doInBackground之前执行(for doInBackground中的循环)

时间:2018-12-17 16:20:20

标签: android firebase asynchronous android-asynctask

我一次在Firestore中上传多张照片,所以我使用asynctask的doInBackground方法中的循环上传,然后我希望所有照片都链接到post方法中,但它无法正常工作。 在完成上传post方法之前,要开始执行。

请给我一些解决方法

new AsyncTask<Void, Void, Void>() {
                @Override
                protected Void doInBackground(Void... voids) {
                    for (int i = 0;i<localphotos.size();i++){
                        storageref = FirebaseStorage.getInstance().getReference("Product/"+System.currentTimeMillis()+".jpg");
                        uploadtask = storageref.putFile(localphotos.get(i))
                                .addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                                    @Override
                                    public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                                        if (task.isSuccessful()) {
                                            Uri downloadUrl = task.getResult().getDownloadUrl();
                                            photolink.add(String.valueOf(downloadUrl));
                                        }
                                    }
                                });
                    }
                    return null;
                }

                @Override
                protected void onPostExecute(Void aVoid) {
                    super.onPostExecute(aVoid);
                    LinkedList<String> size1 = new LinkedList<String>();
                    LinkedList<String> color1 = new LinkedList<String>();

                    final String[] s = size.getText().toString().split("/");
                    final String[] c = color.getText().toString().split("/");

                    final String key = ref.push().getKey();

                    Product product = new Product(key,
                            category.getText().toString(),
                            photolink,
                            deep.getText().toString(),
                            basic.getText().toString(),
                            Integer.parseInt(price.getText().toString()),
                            offer.getText().toString(),
                            brand.getText().toString(),
                            c,
                            s,
                            photolink.get(Integer.parseInt(mainphoto.getText().toString())-1));

                    ref.child(key).setValue(product).addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if (task.isSuccessful()){
                                Toast.makeText(product_detail_add.this, "Product added", Toast.LENGTH_SHORT).show();
                                finish();
                            }
                            else {
                                Toast.makeText(product_detail_add.this, task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                                progressBar2.setVisibility(View.GONE);
                            }
                        }
                    });
                }
            }.execute();

1 个答案:

答案 0 :(得分:0)

您已经在Async任务中实现了监听器(本质上是异步的)。这里不需要异步任务。

相反,

  1. 在主要逻辑中移动for循环,在该逻辑中,异步任务称为
  2. 如果所有文件都已下载,请跟踪onComplete()内的内容
  3. 将行从异步任务的onPostExecute()移至另一种方法,例如postExecution()
  4. 如果所有文件都已下载,请致电postExecution()
  5. 删除异步任务