2017-08-18 30 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);