【问题标题】:How to change value of string from onSucces class如何从 onSucces 类更改字符串的值
【发布时间】:2022-01-14 17:19:15
【问题描述】:

在这里,我读取了一些我想用于创建“Produs”对象的输入,我将其上传到 Firebase 存储,然后我想检索它以显示对象列表,当我想更新时遇到问题图像存储的路径,以便稍后检索。

public class Add extends AppCompatActivity {
    DatabaseReference mDatabase;
    EditText etNume, etCantitate, etPret;
    Button btnSubmit, btnImage;
    Uri mImage;
    ImageView ivTest;
    public static String path="";
    StorageReference mStorageRef;
    final int GALLERY_INTENT = 2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add);
        mDatabase = FirebaseDatabase.getInstance().getReference();
        etNume = findViewById(R.id.etNume);
        etCantitate = findViewById(R.id.etCantitate);
        etPret = findViewById(R.id.etPret);
        btnSubmit = findViewById(R.id.btnSubmit);
        btnImage = findViewById(R.id.btnImage);
        ivTest =findViewById(R.id.ivTest);
        mStorageRef = FirebaseStorage.getInstance().getReference();

        btnImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                i.setType("image/*");
                startActivityForResult(i, GALLERY_INTENT);
            }
        });



        btnSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String nume, pret,cantitate;
                nume = etNume.getText().toString().trim();
                pret = etPret.getText().toString().trim();
                cantitate = etCantitate.getText().toString().trim();

                if(TextUtils.isEmpty(nume)){
                    etNume.setError("Email is required.");
                    return;
                }
                if(TextUtils.isEmpty(pret)){
                    etPret.setError("Email is required.");
                    return;
                }
                if(TextUtils.isEmpty(cantitate)){
                    etCantitate.setError("Email is required.");
                    return;
                }
                StorageReference file = mStorageRef.child("Produs").child(nume + ".jpg");
                file.putFile(mImage).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        path += taskSnapshot.getMetadata().toString(); /// good path
                        Toast.makeText(Add.this, path, Toast.LENGTH_SHORT).show();

                    }
                });
                Toast.makeText(Add.this, path, Toast.LENGTH_SHORT).show();/// null path
                Produs p=new Produs(nume,cantitate,pret,path);
                Task task =mDatabase.child("Produs").child(nume).setValue(p);


                task.addOnSuccessListener(new OnSuccessListener() {
                    @Override
                    public void onSuccess(Object o) {
                        Toast.makeText(Add.this, "Produsul a fost adaugat cu succes", Toast.LENGTH_SHORT).show();
                        startActivity(new Intent(getApplicationContext(),MainActivity.class));
                    }
                });

                task.addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Toast.makeText(Add.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });

            }
        });
    }

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

        if(requestCode == GALLERY_INTENT && resultCode == RESULT_OK && data != null && data.getData() != null){
            mImage = data.getData();
            ivTest.setImageURI(mImage);


        }
    }

}

如何从 onSuccess 方法改变路径? 基本上我想在上传图像以构建“Produs”对象后更改路径 另外,这是图像存储的好方法吗?因为 taskSnapshot.getdownloadURL() 对我不起作用。

【问题讨论】:

    标签: java android firebase firebase-storage


    【解决方案1】:

    问题不在于您设置和读取path 变量的位置,问题在于何时您这样做。由于getDownloadURL() 方法调用服务器,它的onSuccess 可能运行得比你想象的要晚很多。

    如果您看到 path 的值不正确,很可能是设置它的 onSuccess 尚未运行。验证这一点的最简单方法是在读取和写入上设置断点并在调试器中运行,或者通过在 logcat 中添加一些日志记录并检查其顺序。

    这类问题的解决方案总是相同的:任何需要下载 URL 的代码,要么在 onSuccess 内,要么从那里调用,要么以其他方式同步。

    因此,在您的情况下,将 `` 移动到 onSuccess

    StorageReference file = mStorageRef.child("Produs").child(nume + ".jpg");
    file.putFile(mImage).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            path += taskSnapshot.getMetadata().toString(); /// good path
            Toast.makeText(Add.this, path, Toast.LENGTH_SHORT).show();
    
            Toast.makeText(Add.this, path, Toast.LENGTH_SHORT).show();
            Produs p=new Produs(nume,cantitate,pret,path);
            Task task =mDatabase.child("Produs").child(nume).setValue(p);
    
            task.addOnSuccessListener(new OnSuccessListener() {
                ...
            });
    
            task.addOnFailureListener(new OnFailureListener() {
                ...
            });
        }
    });
    

    有关更多信息,请参阅:

    并非所有这些都直接与 Cloud Storage for Firebase 相关,但这里的解释也适用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 2022-07-01
      • 2020-06-21
      • 1970-01-01
      相关资源
      最近更新 更多