如何从 onSucces class 更改字符串的值

How to change value of string from onSucces class

这里我读了一些我想用来创建“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() 对我不起作用。

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

如果您看到 path 的错误值,很可能是设置它的 onSuccess 还没有 运行。验证这一点的最简单方法是在调试器中设置读写断点和 运行ning,或者添加一些日志记录并检查 logcat.[=23= 中的顺序]

此类问题的解决方案总是相同的:任何需要下载 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() {
            ...
        });
    }
});

有关这方面的更多信息,请参阅:

  • Can someone help me with logic of the firebase on success listener

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