2017-08-18 92 views
2

我使用的是Firebase存儲來獲取Android上的圖像列表,但每次啓動該應用程序時都會下載此列表,我希望在Android上存儲持久性圖像,並且只在必要時下載。所以我需要檢查下載的圖像是否在智能手機上。我使用FirebaseDatabase來存儲文件的名稱,對於數據庫我可以檢查持久性。我認爲需要在存儲設備上存儲圖像,但我不知道在下載之前進行檢查,所以最好的方法是儘可能設置持久性FirebaseStorage。如何在Android上設置Firebase存儲的持久性?

我的代碼如下所示:

FirebaseDatabase:

final FirebaseDatabase database = FirebaseDatabase.getInstance(); 
     DatabaseReference databaseReference = database.getReference().child("nomes_imagens"); 

     final Map<String,Object> mapNomesImagens = new HashMap<>(); 

     databaseReference.addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       Log.i(TAG,"onDataChanged()"); 
       Iterator<DataSnapshot> iterator = dataSnapshot.getChildren().iterator(); 

       while(iterator.hasNext()) { 
        DataSnapshot snapshot = iterator.next(); 
        mapNomesImagens.put(snapshot.getKey(),snapshot.getValue()); 
        n1++; 
       } 

       makeList(mapNomesImagens); 
       Log.i(TAG,"Mapa: " + mapNomesImagens.toString()); 
      } 
      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.i(TAG,"onCancelled"); 
      } 
     }); 

FirebaseStorage:

public boolean makeList(Map<String,Object> map) { 
    final FirebaseStorage storage = FirebaseStorage.getInstance(); 

    try { 
     Set<String> set = map.keySet(); 

     for(final String nomeExercicio : set) { 

      String nomeArquivo = String.valueOf(map.get(nomeExercicio)); 

      final File localFile = File.createTempFile("ImagensExercicios","bmp"); 
      storage.getReference().child("ImagensExercicios").child(nomeArquivo).getFile(localFile). 
        addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() { 
         @Override 
         public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) { 
          Log.i(TAG,"onSuccess()"); 
          Bitmap bitmap; 
          bitmap = BitmapFactory.decodeFile(localFile.getAbsolutePath()); 
          Exercicio exercicio = new Exercicio(nomeExercicio,bitmap); 
          exercicios.add(exercicio); 
          n++; 
         } 
        }). 
        addOnFailureListener(new OnFailureListener() { 
         @Override 
         public void onFailure(@NonNull Exception e) { 
          Log.i(TAG,"onFailure() " + e.getMessage()); 
         } 
        }). 
        addOnCompleteListener(new OnCompleteListener<FileDownloadTask.TaskSnapshot>() { 
         @Override 
         public void onComplete(@NonNull Task<FileDownloadTask.TaskSnapshot> task) { 
          Log.i(TAG,"onComplete()"); 
          } 

         } 
        }); 
     } 

     return true; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return false; 
} 

回答

0

AFAIK setpersistence啓用適用於離線數據存儲。所以當互聯網可用時它會刷新。

您可以使用Glide庫來處理緩存。下面給出的Glide官方Firebase使用必須足夠。

鏈接:https://github.com/firebase/FirebaseUI-Android/tree/master/storage

要從StorageReference加載圖像,只需使用 FirebaseImageLoader類:

// Reference to an image file in Cloud Storage 
StorageReference storageReference = ...; 

// ImageView in your Activity 
ImageView imageView = ...; 

// Load the image using Glide 
Glide.with(this /* context */) 
     .using(new FirebaseImageLoader()) 
     .load(storageReference) 
     .into(imageView);