片段中的Firebase数据不是持久的,会重新下载
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了片段中的Firebase数据不是持久的,会重新下载相关的知识,希望对你有一定的参考价值。
我有一个ViewPager,它包含3个片段
我在片段1中有一个TextView“Name”和ImageView“Photo”,当我滚动到片段2或片段3时,我回到片段一,数据被“重新下载”,花费更多的移动数据
我需要在更改片段时,数据保持不变,无需再次下载,如Facebook或Tinder
这是我的代码:
片段一:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
usr = Utils.obtainPref(getContext(), "usuario");
mRootView = inflater.inflate(R.layout.fragment_user_client, container, false);
receiveData();
return mRootView;
}
方法接收数据:
private void receiveData(){
FirebaseUtils.getUsuarioReferencia(usr).child(firebaseUser.getUid()).child("username").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.getValue(String.class) != null){
String name = dataSnapshot.getValue(String.class);
mUsername.setText(name);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
FirebaseUtils.getUsuarioReferencia(usr).child(firebaseUser.getUid()).child("description").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.getValue(String.class) != null){
String desc = dataSnapshot.getValue(String.class);
mDescription.setText(desc);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
FirebaseUtils.getUsuarioReferencia(usr).child(firebaseUser.getUid()).child("photoUrl").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.getValue(String.class) != null){
String url = dataSnapshot.getValue(String.class);
Log.d("fotoo", url);
StorageReference storageReference = FirebaseStorage.getInstance().getReference(url);
if(getActivity() != null){
storageReference.getDownloadUrl().addOnSuccessListener(getActivity(), new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
if(getContext() != null){
Picasso.with(getContext()).load(uri).into(mFotoDePerfil);
}
}
});
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
答案
覆盖片段setUserVisibilityHint()中的函数,并在return语句之后,添加此if(getActivity()==null)
receivedata();
不要在onCreateView()方法中调用接收数据,或者您可以在单独的类中使用公共静态计数器变量并在onCreateView()本身上添加这个..
if (theclass.counter==0)
receivedata();
theclass.counter++;
另一答案
创建一个新类并添加清单
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
}
}
表现:
<application
android:name=".app.MyApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
以上是关于片段中的Firebase数据不是持久的,会重新下载的主要内容,如果未能解决你的问题,请参考以下文章
从 Android Studio 中的片段将数据写入 Firebase
如何从 Firebase 获取数据到 Recyclerview 中的片段?
Flutter Firebase auth 用户在设备上不是持久的