2016-07-20 2 views
1

Привет Я реализую загрузку хранилища в firebase для изображений.Android Firebase время загрузки файла

Что я делаю, это выбрать изображение из моей галереи, а затем отобразить его на ImageView, а затем загрузить его в хранилище.

Все работает. Но мое беспокойство - это первый раз, когда я загружаю изображение, которое я проверил и занимает около минуты, чтобы вернуть путь загрузки.

После первого раза занимает меньше секунды. Моя проблема в том, что я хочу использовать этот путь для другого ImageViews после закрытия действия «загрузить изображение».

Вот мой код.

У меня есть диалоговое окно для выбора галереи (у меня будет возможность facebook позже)

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(); 
    } 
}; 

Тогда вот это деятельность Результат

@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); 
      } 
     }); 
    } 


} 

Время между двумя бревнами «PATH в телефоне »и« PATH IN FIREBASE »происходит примерно через минуту в первый раз, а затем довольно быстро. Вопрос в том, знаете ли вы способ, метод или шаблон, чтобы скорость была загружена все время, а не только второй раз? Или что вы предлагаете? лучше ли сохранять изображение в Base64, используя базу данных реального времени вместо хранения?

ответ

-1

Причина, по которой вы видите отставание при первой загрузке, заключается в том, что Firebase поддерживается Google App Engine, который, когда ваш сервер не используется в течение длительного периода времени, в основном ставит его в состояние паузы, чтобы сэкономить ресурсы.

Когда вы идете, чтобы сделать запрос, когда он находится в этом состоянии паузы он должен крутиться обратно все, что есть, когда вы видите задержку во время загрузки

+0

иметь смысл, знаете ли вы способ вручную изменить состояние из паузы, чтобы возобновить бэкэнд в firebase для этого случая? Я новичок в firebase. – Sergio

+0

вы не можете это сделать – tyczj

+0

hehe ok спасибо! – Sergio

1

Firebase хранение не поддержанной App Engine (это акции тот же самый контейнер GCS по умолчанию, но не работает на GAE), но я могу понять, почему это может заставить вас думать, что он медленный в первый раз.

Что я могу сказать, что может произойти, что базовое соединение с сервером становится кэшированным после первого экземпляра, и может произойти первоначальная задержка из-за вашего местоположения или аналогичной проблемы.

Можете ли вы рассказать мне, в какой общей области вы находитесь?
Кроме того, можете ли вы проверить, что если вы делаете какую-либо фиктивную загрузку (в любое место, включая другое ведро), то скорость улучшается?

+0

Привет, Бенджамин. Я не пробовал ни одного другого региона, кроме Великобритании. и каждый раз, когда первая загрузка длится около 1 минуты, остальные были почти мгновенно. Наконец, я включил в него progressdialog, который показывает прогресс во время загрузки. Здесь выполняется реализация https://github.com/casertillo/AndroidProjects/blob/master/TutumpDev/app/src/main/ java/com/tutump/tutumpdev/Activities/EditProfileActivity.java # L300 Это метод, начинающийся в строке 300. Надеюсь, он работает для вас. – Sergio

Смежные вопросы