再ダウンロードされ、私はへスクロールしたときに、私は3断片Firebaseデータの永続的ではありません、
が含まれているViewPagerが、私は、フラグメント1でのTextView「名前」とImageViewの「写真」を持っていますフラグメント2またはフラグメント3と私は、データが "再ドンロード"され、より多くのモバイルデータを費やす、フラグメント1に戻ります。
フラグメントを変更すると、データはダウンロードする必要がなくなります再び、FacebookやTinderのように
これは私のコードです:
フラグメント1:
@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) {
}
});
}
リスナーが切り離された瞬間、データがメモリから削除されます。フラグメントをトランジションしている間、リスナを生かし続けるのは簡単ではありませんが、@DougStevensonは最近、アクティビティ内でこれを達成する方法に関する一連のブログ記事を書いています。すべてのパーツを読むことをお勧めします([1](https://firebase.googleblog.com/2017/12/using-android-architecture-components.html)、[2](https://firebase.googleblog.com/ 2017/12/using-android-architecture-components_20.html)、[3](https://firebase.googleblog.com/2017/12/using-android-architecture-components_22.html))に適用し、あなたの状況: –
@FrankvanPuffelen私は 'FirebaseDatabase.getInstance()。setPersistenceEnabled(true);を使用しました。 'とありがとうございます – Dskato
ディスクの永続性だけで、クライアントは新しいフラグメントがトリガーされたときに新しいデータをチェックします。ディスクの永続性を持たない場合よりも少ないデータを転送できます。転送を保証する唯一の方法は、リスナーを存続させることです。 –