为了账号安全,请及时绑定邮箱和手机立即绑定

使用 AsyncTask 读取 Firestore 文档

使用 AsyncTask 读取 Firestore 文档

米琪卡哇伊 2023-09-20 19:11:04
我在 Cloud Firestore 中有一个数据库,其中每个文档都有一个特定的键“上次更新”,其值是一个字符串,表示 YYYY-MM-DD 形式的日期。每次更新文档时,将“上次更新”的值设置为更新日期。现在,我希望我的活动有一个方法来检查文档的上次更新。由于文档包含相当大的对象列表,因此此更新检查需要几秒钟。所以我决定将其推迟到 AsyncTask。AsyncTask 的 doInBackground 方法应该为文档创建一个 DocumentReference noteRef,并使用配有 onSuccess 和 onFailure 侦听器的 noteRef.get() 将其“最后更新”读取到 String 中,然后由该方法返回。为了测试这一点,我创建了一个玩具活动 MyTestActivity,它使用字符串参数“myCollection”和“myDocument”调用上述 AsyncTask,并在 TextView 中显示该文档上次更新的值。现在,TextView 不再显示实际值“2019-10-03”,而是显示值“1970-01-01”,这是 doInBackground 中用于初始化返回的 String 变量的值。就好像 doInBackground 不费心去等待文档被读取一样。代码如下。public class MyTestActivity extends AppCompatActivity{     private Button button;    private TextView textView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_my_test);        button = findViewById(R.id.update_button);        textView = findViewById(R.id.update_text_view);    }    public void buttonClicked(View view) throws ExecutionException, InterruptedException {        UpdateTask task = new UpdateTask(this, "myCollection", "myDocument");        String date =  task.execute().get();        textView.setText("Last update on "+date);    }    private static class UpdateTask extends AsyncTask<Integer, Integer, String> {        private WeakReference<MyTestActivity> activityWeakReference;        String collection;        String document;        String lastUpdate;        UpdateTask(MyTestActivity activity, String collection, String document) {            activityWeakReference = new WeakReference<MyTestActivity>(activity);            this.collection = collection;            this.document = document;            lastUpdate = new String();        }        @Override        protected void onPreExecute() {            super.onPreExecute();            MyTestActivity activity = activityWeakReference.get();            if (activity == null || activity.isFinishing()) {                return;            }        }谁能解释一下这是怎么回事?
查看完整描述

2 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

我在 Firebase Firestore 中有一个数据库,其中每个文档都有一个特定的键“上次更新”,其值是一个字符串,表示 YYYY-MM-DD 形式的日期。

将日期存储为字符串的情况并不常见,您应该将其存储为:

FieldValue.serverTimestamp()

正如我在以下帖子的回答中所解释的:

  • Firebase Firestore 上的 ServerTimestamp 始终为 null

所以我决定将其推迟到 AsyncTask。

Cloud Firestore 数据库客户端已在后台线程中运行所有网络操作。这意味着所有操作的发生都不会阻塞主线程。将其添加到 an 中AsyncTask根本不会带来任何好处。

现在,TextView 显示值“1970-01-01”,而不是显示实际值“2019-10-03”,这是 doInBackground 中使用的值

发生这种情况是因为您尝试从异步方法同步返回消息。这不是一个好主意。您应该按预期异步处理 API。


查看完整回答
反对 回复 2023-09-20
?
梦里花落0921

TA贡献1772条经验 获得超5个赞

哎哟! 这是糟糕的设计。Firestore 调用是异步的,因此您不需要将它们放入 asyncTask 后台方法中。此外,使用同步任务不会更快地执行代码。您需要的是“正在加载消息”,直到您的 OnSuccessListener 重新触发。



查看完整回答
反对 回复 2023-09-20
  • 2 回答
  • 0 关注
  • 59 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信