片段中的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 中的片段?

Firebase 到 Kotlin 片段

Flutter Firebase auth 用户在设备上不是持久的

如何在 Android 上的 Firebase 存储中设置持久性?

如何获取片段内在firebase中注册的用户数?