私は、クイズアプリを作成しています。アプリでの質問は絶えず変化しているいくつかの値に基づいています。私が使用しているので、addSnapshotListener()
データベース内で行われるすべての変更を取得します。ドキュメントの私は結構ですが、問題は私のアプリでは、配向性が非常に頻繁に変化していることで、リスナーを削除する必要があることとどまります。私はあまりにも多くの時間を添付し、リスナーを削除することをこれが意味。これは悪いアプローチですか?これをどのように解決するには?
これは悪いアプローチですか?
いいえ、ちがいます!それはもはや必要ではないです一度あなたは間違いなく、リスナーを削除する必要があります。私はあなたの中にリスナーを追加していると仮定onStart()
する方法と、あなたにそれを削除するonStop()
権利、あなたの活動の方法?その場合は、両方の方法は離れて活動のライフサイクルのあると向きが変更されるたびに呼ばれているので、これは、正常な動作であることに注意してください。毎回再配向が起こるよう、活動が破壊され、再び再作成されます。もっとに関する情報を参照してください。
あなたはよりエレガントな方法は、リスナーを削除したい場合は、このことから私の答えの最後の部分を参照すべきであるポストを。だから、最初の引数としての活動を渡すことができaddSnapshotListener()メソッドとリスナーがあなたのために自動的に削除されます。
編集:
あなたのコメントによると、あなたは正しいです。あなたはそのソリューションを使用している場合でも、リスナーを取り付け、取り外しの数が同じになります。この場合、私はその数を減らすことができます解決策を持っています。
private boolean pending = false;
private Handler handler = new Handler();
private Runnable runnable = new Runnable() {
@Override
public void run() {
//Remove listener
pending = false;
}
};
@Override
protected void onStart() {
super.onStart();
if (pending) {
handler.removeCallbacks(runnable);
} else {
//Attach listener
}
pending = false;
}
@Override
protected void onStop() {
super.onStop();
handler.postDelayed(runnable, 3000);
pending = true;
}
これは基本的にあることを意味Handler
使用して、リスナーの削除をスケジュールしますRunnable
actualyを呼び出した後、3秒後に削除を実行しますコールバックをonStop()
。私は、姿勢変更のための3秒に遅延時間を設定しましたが、現実の世界の状況では、それははるかに高速でも、古い携帯電話で正常です。
向きが速いものを3秒以上であれば、我々は単にコールバックを削除し、リスナーがリスニングを維持することができます。これは明らかに、あなたがリスナーを取り除くの数を減らすことを意味します。
が存在しますので、これはまた、非常に有用であろうではないにしてFirestoreは、結果が変更されなかった場合でも、データをプルダウンするバックエンドから二往復。