【问题标题】:How to call value from override method java?如何从覆盖方法java调用值?
【发布时间】:2018-12-27 09:20:25
【问题描述】:

如何从覆盖方法中获取价值?

这是我的代码,我厌倦了将 url 设置为 setValue(url) 但我无法获取

String url =dlUri.toString(); this value

child("downloadurl").setValue(url);

public void upload(View view){

    UUID uuidImage = UUID.randomUUID();

    String imageName = "images/"+uuidImage+".jpg";

    final StorageReference storageReference = mStorageRef.child(imageName);

    storageReference.putFile(selected).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {



        @SuppressWarnings("VisibleForTests")
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {


            UUID uuid = UUID.randomUUID();
            final String uuidString = uuid.toString();

            storageReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                @Override
                public void onSuccess(Uri uri) {
                    Uri dlUri = uri;
                    String url =dlUri.toString();
                }
            });

            FirebaseUser user = mAuth.getCurrentUser();
            String userEmail = user.getEmail().toString();
            String userComment = commentText.getText().toString();


            myRef.child("Posts").child(uuidString).child("useremail").setValue(userEmail);
            myRef.child("Posts").child(uuidString).child("comment").setValue(userComment);
            myRef.child("Posts").child(uuidString).child("downloadurl").setValue(url);




            Toast.makeText(getApplicationContext(),"Post Shared",Toast.LENGTH_LONG).show();

            Intent intent = new Intent(getApplicationContext(), FeedActivity.class);
            startActivity(intent);

        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Toast.makeText(getApplicationContext(), e.getLocalizedMessage(),Toast.LENGTH_LONG).show();
        }
    });

}

【问题讨论】:

    标签: java android firebase-realtime-database


    【解决方案1】:

    这是因为String url = dlUri.toString(); 不在您要访问的范围内。为什么不直接将所有代码移到onSuccess() 中,因为我认为您无论如何都需要等待该值?

    【讨论】:

      【解决方案2】:

      storageReference.getDownloadUrl().addOnSuccessListener() 之外声明url。使用前请检查url是否为空

      String url;
      storageReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                  @Override
                  public void onSuccess(Uri uri) {
                      Uri dlUri = uri;
                      url =dlUri.toString();
                  }
              });
      

      【讨论】:

        【解决方案3】:

        你不需要在onSsuccesslistener中再次调用storageReference.getDownloadUrl()你可以直接获取url为

        taskSnapshot.downloadUrl.toString()

        参考下面的代码。

        storageReference.putFile(selected).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        
            @SuppressWarnings("VisibleForTests")
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                      String url = taskSnapshot.downloadUrl.toString()
               } }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(getApplicationContext(), e.getLocalizedMessage(),Toast.LENGTH_LONG).show();
            }
        });
        
           }
        

        【讨论】:

        • 这是错误的。请注意,onSucces 方法在问题中不相等。
        • String url = taskSnapshot.downloadUrl.toString() 此用法已被删除。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-22
        • 1970-01-01
        • 2014-05-11
        相关资源
        最近更新 更多