亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 AsyncTask 讀取 Firestore 文檔

使用 AsyncTask 讀取 Firestore 文檔

米琪卡哇伊 2023-09-20 19:11:04
我在 Cloud Firestore 中有一個數據庫,其中每個文檔都有一個特定的鍵“上次更新”,其值是一個字符串,表示 YYYY-MM-DD 形式的日期。每次更新文檔時,將“上次更新”的值設置為更新日期?,F在,我希望我的活動有一個方法來檢查文檔的上次更新。由于文檔包含相當大的對象列表,因此此更新檢查需要幾秒鐘。所以我決定將其推遲到 AsyncTask。AsyncTask 的 doInBackground 方法應該為文檔創建一個 DocumentReference noteRef,并使用配有 onSuccess 和 onFailure 偵聽器的 noteRef.get() 將其“最后更新”讀取到 String 中,然后由該方法返回。為了測試這一點,我創建了一個玩具活動 MyTestActivity,它使用字符串參數“myCollection”和“myDocument”調用上述 AsyncTask,并在 TextView 中顯示該文檔上次更新的值?,F在,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條經驗 獲得超6個贊

哎喲! 這是糟糕的設計。Firestore 調用是異步的,因此您不需要將它們放入 asyncTask 后臺方法中。此外,使用同步任務不會更快地執行代碼。您需要的是“正在加載消息”,直到您的 OnSuccessListener 重新觸發。



查看完整回答
反對 回復 2023-09-20
  • 2 回答
  • 0 關注
  • 116 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號