Android Firebase 上传文件时间

Android Firebase upload file time

您好,我正在 firebase 中为图像实现存储上传。

我正在做的是 select 我图库中的图像,然后将其显示在 ImageView 上,然后将其上传到存储。

一切正常。但我担心的是我第一次上传图片时,我已经测试过 return 下载路径大约需要一分钟。

第一次用时不到一秒。我的问题是我想在关闭 "upload image" activity.

后将该路径用于另一个 ImageViews

这是我的代码。

我有一个到 select 画廊的对话框(稍后我会有 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();
    }
};

那么这里是Activity结果

@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 IN PHONE" 和 "PATH IN FIREBASE" 之间的时间间隔大约一分钟,然后很快。问题是,您是否知道一种方式、方法或模式可以一直保持速度上传,而不仅仅是第二次? 或者你有什么建议?使用实时数据库而不是存储以 Base64 格式存储图像是否更好?

您在第一次上传时看到延迟的原因是因为 Firebase 由 Google App Engine 支持,当您的后端长时间未使用时,它基本上会处于暂停状态以节省资源.

当您在暂停状态下发出请求时,它需要重新启动所有内容,这就是您看到上传时间滞后的情况

Firebase 存储不受 App Engine 支持(它共享相同的默认 GCS 存储桶,但不 运行 在 GAE 上)但我能理解为什么这可能会让您第一次觉得它很慢。

我认为可能发生的情况是与服务器的基础连接在第一个实例之后被缓存,并且由于您的位置或类似问题可能会出现初始延迟。

你能告诉我你所在的大致区域吗?
此外,您能否验证如果您进行任何虚拟上传(到任何位置,包括不同的存储桶),那么速度会提高吗?