AsyncTask无法在Android中按预期工作

时间:2018-08-01 07:26:53

标签: android firebase android-asynctask firebase-storage android-background

GetImages getImages = new GetImages();
getImages.execute(keys); 


    private class GetImages extends AsyncTask(String, Void, Void){



            @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                }

                @Override
                protected Void doInBackground(String... keys) {
                    for(String key : keys){
                        StorageReference referenceImage = FirebaseStorage.getInstance().getReference().child("images/"+key);
                        final long ONE_MB = 1024*1024;
                        referenceImage.getBytes(ONE_MB).addOnSuccessListener(new OnSuccessListener() {
                            @Override
                            public void onSuccess(byte[] bytes) {
                                Toast.makeText(getApplicationContext(),"Success to Load Bitmap ....",Toast.LENGTH_LONG).show();
                                Bitmap bm = BitmapFactory.decodeByteArray(bytes,0,bytes.length);
                            }
                       });
                    }
                    return null;
                }

                @Override
                protected void onPostExecute(Void aVoid) {
                    Toast.makeText(getApplicationContext(),"Completed  All   Tasks ............",Toast.LENGTH_LONG).show();
                }
                }
        }

该代码的问题是AsyncTask在完成onPostExecute()之前执行doInBackGround() Completed All Tasks ... (已完成所有任务...) Toast在成功加载位图 Toast前显示。我不明白是什么问题。

2 个答案:

答案 0 :(得分:1)

Firebase方法referenceImage.getBytes本身是异步的,不需要将其放在AsyncTask中。要在获取图像后显示Toast,可以执行以下操作:

referenceImage.getBytes(ONE_MB).addOnSuccessListener(new OnSuccessListener() {
   @Override
   public void onSuccess(byte[] bytes) {
     Toast.makeText(getApplicationContext(),"Success to Load 
     Bitmap....",Toast.LENGTH_LONG).show();
     Bitmap bm = BitmapFactory.decodeByteArray(bytes,0,bytes.length);
     Toast.makeText(getApplicationContext(),"Completed  All Tasks 
     ............",Toast.LENGTH_LONG).show();
        }
     });

答案 1 :(得分:0)

GetImages getImages = new GetImages();
getImages.execute(key); 

密钥必须在GetImages类中初始化

protected void onPostExecute(Void aVoid) {
      Toast.makeText(getApplicationContext(),"Completed  All   Task .......",Toast.LENGTH_LONG).show();
            }

方法在doinbackground完成之后运行,您需要返回标记或数据以用于标记完成方法。不要返回NULL