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

Posted

技术标签:

【中文标题】如何从 onSucces 类更改字符串的值【英文标题】:How to change value of string from onSucces class 【发布时间】: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() 对我不起作用。

【问题讨论】:

【参考方案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() 
            ...
        );
    
);

有关更多信息,请参阅:

How to store download image url in realtime database firebase android How to store Url into ArrayList from Firebase Storage? Can someone help me with logic of the firebase on success listener getContactsFromFirebase() method return an empty list Setting Singleton property value in Firebase Listener

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

【讨论】:

以上是关于如何从 onSucces 类更改字符串的值的主要内容,如果未能解决你的问题,请参考以下文章

如何确定字符串变量的值是不是在 C# 中更改?

如何使用从wpf中的数据库中获取的值更改datagrid行背景颜色

String: 字符串类,字符串是常量;它们的值在创建之后不能更改 复习

如何使用 Json.NET 更改 JSON 属性的值? [关闭]

如何从 php 脚本更改活动的字符串值并重新创建 apk 文件

是否可以从另一个单独的 .NET AppDomain 更改 .NET AppDomain 中的字符串属性的值