0

再ダウンロードされ、私はへスクロールしたときに、私は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) { 

     } 
    }); 
} 
+0

リスナーが切り離された瞬間、データがメモリから削除されます。フラグメントをトランジションしている間、リスナを生かし続けるのは簡単ではありませんが、@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))に適用し、あなたの状況: –

+0

@FrankvanPuffelen私は 'FirebaseDatabase.getInstance()。setPersistenceEnabled(true);を使用しました。 'とありがとうございます – Dskato

+0

ディスクの永続性だけで、クライアントは新しいフラグメントがトリガーされたときに新しいデータをチェックします。ディスクの永続性を持たない場合よりも少ないデータを転送できます。転送を保証する唯一の方法は、リスナーを存続させることです。 –

答えて

0

オーバーライドフラグメントsetUserVisibilityHint関数() をし、return文の後に、で受信データを呼び出してはいけない、このif(getActivity()==null) receivedata(); を追加しますonCreateView()メソッドを使用するか、別のクラスでパブリック静的カウンタ変数を使用できます。また、onCreateView()自体にthisを追加することもできます。

if (theclass.counter==0) receivedata(); theclass.counter++;

+0

私はnullPointerExceptionを与える動作しませんjava.lang.NullPointerException:私はデータベースを呼び出すときに、子()の引数 'pathString'にnullを渡すことはできません – Dskato

+0

別のクラスとパブリック静的カウンタ変数を作成する= 0 ; (countervar == 0) –

+0

receivedata(); onCreateView()でそれを呼び出します。カウンタ++; –

0

新しいクラスを作成し、

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"> 
関連する問題