2016-07-20 12 views
1

Hallo ich bin die Umsetzung der Speicher-Upload in Firebase für Bilder.Android Firebase Upload-Datei Zeit

Ich wähle ein Bild aus meiner Galerie aus, zeige es auf einem ImageView an und lade es dann auf den Speicher hoch.

Alles funktioniert. Aber mein Anliegen ist das erste Mal, dass ich ein Bild hochlade, das ich getestet habe und ungefähr eine Minute brauche, um den Download-Pfad zurückzugeben.

Nach dem ersten Mal dauert weniger als eine Sekunde. Mein Problem ist, dass ich diesen Pfad für andere ImageViews verwenden möchte, nachdem ich die Aktivität "Bild hochladen" beendet habe.

Hier ist mein Code.

ich einen Dialog haben die Galerie zu wählen (ich werde später die Facebook-Option)

private View.OnClickListener dialogListener = new View.OnClickListener() { 

    @Override 
    public void onClick(View view) { clicked.length()); 
     final Dialog dialog = new Dialog(EditProfileActivity.this); 
     dialog.setContentView(R.layout.galleryoptions); 
     dialog.setTitle("Gallery Options"); 

     Button gallery = (Button) dialog.findViewById(R.id.buttonGallery); 
     gallery.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       dialog.dismiss(); 
       Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
       startActivityForResult(intent, RESULT_LOAD_IMAGE); 
      } 
     }); 

     dialog.show(); 
    } 
}; 

hier dann wird die Tätigkeit Ergebnis

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { 
     Uri selectedImage = data.getData(); 
     String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

     Cursor cursor = getContentResolver().query(selectedImage, 
       filePathColumn, null, null, null); 
     cursor.moveToFirst(); 

     //GET PATHS 
     int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
     String picturePath = cursor.getString(columnIndex); 
     Log.d(TAG, "PICTURE PATH IN PHONE: " + picturePath); 
     cursor.close(); 
     clicked = "iv_"+clicked; 
     int resID = getResources().getIdentifier(clicked, "id", "com.my.project"); 
     ImageView imageView = (ImageView) findViewById(resID); 
     imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); 

     //UPLOAD FILE TO FIREBASE 
     Uri file = Uri. fromFile(new File(picturePath)); 
     String extension = file.getLastPathSegment(); 
     extension = extension.substring(extension.lastIndexOf(".")); 
     StorageReference riversRef = storageRef.child("images/"+ user.getUid().toString()+"/"+clicked+extension); 
     UploadTask uploadTask = riversRef.putFile(file); 

     // Register observers to listen for when the download is done or if it fails 
     uploadTask.addOnFailureListener(new OnFailureListener() { 
      @Override 
      public void onFailure(@NonNull Exception exception) { 
       // Handle unsuccessful uploads 
      } 
     }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
      @Override 
      public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
       // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL. 
       Uri downloadUrl = taskSnapshot.getDownloadUrl(); 
       Log.d(TAG, "DOWNLOAD PATH IN FIREBASE: " + downloadUrl); 
      } 
     }); 
    } 


} 

Die Zeit zwischen den beiden Protokollen „PATH IN PHONE "und" PATH IN FIREBASE "ist beim ersten Mal ungefähr eine Minute, dann ist es ziemlich schnell. Die Frage ist, kennen Sie einen Weg oder eine Methode oder ein Muster, um die Geschwindigkeit die ganze Zeit und nicht nur das zweite Mal hochzuladen? Oder was schlägst du vor? ist es besser, das Bild in Base64 mit der Echtzeit-Datenbank anstelle von Speicher zu speichern?

Antwort

-1

Der Grund für die Verzögerung beim ersten Hochladen ist, dass Firebase von Google App Engine unterstützt wird. Wenn Ihr Backend längere Zeit nicht verwendet wird, wird es in einen pausierten Status versetzt, um Ressourcen zu sparen.

Wenn Sie gehen, um eine Anfrage zu machen, wenn sie in diesem Zustand angehalten ist muss es wieder nach oben, alles drehen, das ist, wenn Sie die Verzögerung in der Upload-Zeit sehen

+0

Sinn machen, wissen Sie eine Möglichkeit, den Status von paused manuell zu ändern, um das Back-End in Firebase für diesen Fall wieder aufzunehmen? Ich bin neu in der Firebase. – Sergio

+0

kann man das nicht tun – tyczj

+0

hehe ok danke! – Sergio

1

Firebase Speicher wird nicht von App Engine (es Aktien gesichert der gleiche Standard-GCS-Bucket, aber läuft nicht auf GAE), aber ich kann verstehen, warum das Sie denken lassen könnte, dass es das erste Mal langsam ist.

Was ich denke, was passieren kann, ist, dass die zugrunde liegende Verbindung zum Server nach der ersten Instanz zwischengespeichert wird und es aufgrund Ihres Standortes oder eines ähnlichen Problems zu einer anfänglichen Verzögerung kommen kann.

Können Sie mir sagen, in welcher allgemeinen Region Sie sich befinden?
Können Sie auch überprüfen, ob die Geschwindigkeit verbessert wird, wenn Sie einen Dummy-Upload durchführen (an einen beliebigen Ort, einschließlich eines anderen Buckets)?

+0

Hallo Benjamin. Ich habe keine andere Region als Großbritannien versucht. und jedes Mal, wenn der erste Upload etwa 1 Minute dauert, waren die anderen fast sofort. Was ich letztendlich implementiert habe, war ein Fortschrittdialog, der den Fortschritt während des Hochladens anzeigt. Hier ist die Implementierung https://github.com/casertillo/AndroidProjects/blob/master/TutumpDev/app/src/main/ java/com/tutump/tutumpdev/Aktivitäten/EditProfileActivity.java # L300 Es ist die Methode beginnend in Zeile 300. Hoffe, es funktioniert für Sie. – Sergio