我在 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;
}
}
谁能解释一下这是怎么回事?
慕侠2389804
梦里花落0921
相关分类