gpt4 book ai didi

java - android setText 在 fragment 内延迟

转载 作者:行者123 更新时间:2023-12-01 19:36:18 24 4
gpt4 key购买 nike

我试图在设置View之前更新(在Fragment内)TextView。一切正常,但 setText 被延迟。该应用程序使用 android:text="something" 中预先设置的值运行,稍后这些值会更改为我想要的值(大约 0.5 秒后)。我从 firebase 获取值。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_profile, container, false);

UserName = v.findViewById(R.id.textview_user_name);
UserInfo = v.findViewById(R.id.textview_user_info);

mDatabase = FirebaseFirestore.getInstance();
return v;
}

这是我获取数据的地方

// here inside onStart i try to setText into textViews
// values are queried from my FirebaseFirestore
@Override
public void onStart() {
docRef = mDatabase.collection("users").document(uId);
docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
if (documentSnapshot.exists()){
User user = documentSnapshot.toObject(User.class);

UserName.setText(user.getName());
UserInfo.setText(user.getInfo());
} else {
Log.e(TAG,"Document does not exits");
}
}
});
super.onStart();
}

最佳答案

您正在尝试从远程服务器获取数据(在您的情况下,这是您的 Firebase 数据库)。即使您在 onStart 函数中添加了 addOnSuccessListener,这也会创建一个异步线程,用于从 Firebase 获取所需的数据。但是,与此同时, Activity 已加载,您可以在 TextView 中看到预设值。

如果您不想在从 Firebase 数据库加载数据之前显示 TextView,您可以考虑执行以下操作。

onCreateView 函数中,将 TextView 的可见性设置为 INVISIBLE,如下所示。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_profile, container, false);

UserName = v.findViewById(R.id.textview_user_name);
UserInfo = v.findViewById(R.id.textview_user_info);

// Set the visibility to invisible here. So that when the application is loaded, you do not see the pre-set values.
UserName.setVisibility(View.INVISIBLE);
UserInfo.setVisibility(View.INVISIBLE);

mDatabase = FirebaseFirestore.getInstance();
return v;
}

当从 Firebase 获取数据并在您的 Activity 中可用时,再次将 View 的可见性设置为 VISIBLE

@Override
public void onStart() {
docRef = mDatabase.collection("users").document(uId);
docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
if (documentSnapshot.exists()){
User user = documentSnapshot.toObject(User.class);

UserName.setText(user.getName());
UserInfo.setText(user.getInfo());

// Set the visibility to VISIBLE again here
UserName.setVisibility(View.VISIBLE);
UserInfo.setVisibility(View.VISIBLE);
} else {
Log.e(TAG,"Document does not exits");
}
}
});
super.onStart();
}

希望能帮助您理解该场景。

编辑:

您可以考虑将经常使用的信息保存在本地存储中,以便在打开应用程序后立即加载它们。如果信息不多,您可以考虑使用 SharedPreference 将数据存储在应用程序的内部存储中,以便在启动 时可以直接在应用程序中加载它们 fragment Here's how您可以将数据保存在 SharedPreference 中并可以从中检索数据。

但是,您需要考虑到,如果在本地存储中保存(即缓存)某些内容,则需要在远程更改数据时进行更新。因此,在从 firebase(或应用程序中更新 userName 或 userInfo 的任何位置)获取更新的数据后,您需要相应地更新本地存储中存储的数据。希望你能明白。

关于java - android setText 在 fragment 内延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57384201/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com