2017-06-16 3 views
0

Ich versuche zu erreichen, Bilder aus dem Firebase-Speicher nacheinander in ein ImageView in einer Android-App herunterladen. Bisher war ich erfolgreich, aber das Ergebnis ist mehr oder weniger schrecklich, weil das Aktualisieren des Bildes ein Flackern verursacht, d.h. ein leeres Bild zwischen beiden Bildern.Android Glide und Firebase Storage: Lädt fortlaufende Bilder von Firebase Storage nach Imageview - Flackern

Ich speichere den letzten Bildpfad in einer Firebase-Echtzeitdatenbank im Knoten "state/recentPicture". Jedes Mal, wenn dies aktualisiert wird, hole ich es über einen ValueEventListener in meiner Android-App und aktualisiere dann meine Bildansicht via glide. Die Framerate der Bilder beträgt 3 pro Sekunde. Mein Code lookes wie folgt aus:

mFirebaseDatabase.child("state").child("recentPicture").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Log.d("Picture Update:",dataSnapshot.toString()); 
      String imgPath = dataSnapshot.getValue(String.class); 
      mStorageRef = FirebaseStorage.getInstance().getReference().child(imgPath); 
      Glide.with(getContext()) 
        .using(new FirebaseImageLoader()) 
        .load(mStorageRef) 
        .fitCenter() 
        .crossFade() 
        .into(mImageView); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

Das Bild loader-Klasse von der Github Seite von firebaseUI direkt kopiert wird: FirebaseImageLoader from FirebaseUI

Ich denke ich, dass vielleicht muss ich vor mehreren Bildern puffern den Prozess des Startens sie in meine Bildansicht einfügen.

Hat jemand bessere Vorschläge. Auf lange Sicht möchte ich "Video-Streaming" über Standbilder simulieren. Die Bilder sind mehr oder weniger Live-Bilder. Vielleicht ist der gesamte Ansatz mit Firebase-Datenbank und Firebase-Speicher falsch. Wenn Sie bessere Vorschläge haben, würde ich mich freuen, sie zu hören.

Als zusätzliche Information möchte ich hinzufügen, dass die Bildansicht in einem Fragment liegt. Ich habe auch schon versucht, die Crossfade-Funktion wegzulassen und dontAnimate() und dontTransform() verwendet, aber keine Verbesserung gezeigt.

Antwort

0

Eine Lösung gefunden: Ich benutze auf Ressource bereit und ein SimpleTarget. Die Downloadpfade werden in einer ArrayList gepuffert.

Der Wert Listener sieht so aus.

mFirebaseDatabase.child("state").child("recentPicture").addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Log.d("Picture Update:",dataSnapshot.toString()); 
      String imgPath = dataSnapshot.getValue(String.class); 
      if (imgPath!= null) mPictures.add(imgPath); 
      if (mPictures.size()==1){ 
       mStorageRef = FirebaseStorage.getInstance().getReference().child(imgPath); 
       Glide.with(getContext()) 
         .using(new FirebaseImageLoader()) 
         .load(mStorageRef) 
         .asBitmap() 
         .fitCenter() 
         .into(target); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

Das einfache Ziel wie folgt aus:

private SimpleTarget target = new SimpleTarget<Bitmap>() { 

    @Override 
    public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { 
     mImageView.setImageBitmap(resource); 

     if(mPictures.size()>=1){ 
      String imgPath = mPictures.get(0); 
      Log.d("Printing picture:",imgPath); 
      mPictures.remove(0); 
      mStorageRef = FirebaseStorage.getInstance().getReference().child(imgPath); 
      Glide.with(getContext()) 
        .using(new FirebaseImageLoader()) 
        .load(mStorageRef) 
        .asBitmap() 
        .fitCenter() 
        .into(target); 
     } 

    } 
}; 

Und die Bildpfade sind in einem privaten Bereich gespeichert:

private ArrayList<String> mPictures = new ArrayList<>(); 
Verwandte Themen