問題タブ [android-loader]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - ローダー: onLoadFinished は 1 回だけ呼び出されます
アクティビティで使用されているローダーが 1 つあります。ローダーを開始でき、onLoadFinished が呼び出されます。データを更新onContentChanged
してローダーを呼び出すと、それが表示されloadInBackground
、deliverResult
両方が呼び出されます。ここでトレイルが停止するようです。へのコールバックがありませんonLoadFinished
。
アクティビティを再作成すると (別名、向きの変更または再起動)、同じように動作します。
support-v4 ローダーとローダー マネージャーを使用しています。
私のCommonsWareのローダーSharedPreferenceLoader
に基づいています:
ローダーの使用方法は次のとおりです。
更新LoaderManagerソース
でこれを見つけました。onLoadFinished
データに同じ参照がある場合、への呼び出しが呼び出されないように見えます。
android - Androidの連絡先ローダーから電話番号を取得する:プロジェクションクラッシュ
Google チュートリアルのサンプル コードを使用しています。投影は、収集したいデータを指定する場所です。電話番号が必要であることを指定するにはどうすればよいですか? Google のサンプルは電話番号を取得しません。しかし、電話番号を取得したいので、 のフィールドを追加します Phone.NUMBER
。しかし、そうすると、アプリは常にクラッシュします。これが私の予測です。
ここにエラートレースがあります
android - データベースの変更時に CursorLoader が更新されない
CursorLoader
をロードする非常に平野がありますCursor
。カーソルをアクティビティのフィールドとして保存します。(そうではありませんCursorAdapter
!)
を呼び出すとContentResolver.notifyChange(URI_BUNDLES, null)
、CursorLoader がリロードされると思いますが、そうではありません。(LoaderCallbacks
以下を参照してください。コールバックをログに記録します。)
この問題をデバッグするために、奇妙なことに動作する小さなContentObserver
を登録しました。
ここからデバッグする方法がわからないことを知っています。私のCursorLoader
初期化は問題ありませんContentObserver
が、何らかの理由でCursorLoader
、基になるデータベースが変更されたときにカーソルをリロードしません。何が間違っている可能性がありますか?
これが私のものLoaderCallbacks
です:
android - OnLoadFinished で swapCursor を呼び出すときの長い遅延
LoaderCallbacks を持つカスタマイズされた CursorAdpater を含む ListView を実装しています。OnCreatLoader が呼び出されると、DB から theCursor を取得する AsyncTaskLoader を実行しています。カーソルがロードされた後に swapCursor を呼び出すと、遅延があることに気付きました。一度に10個のアイテムをロードするような解決策はありますか?もしそうなら、どこでこれを行うことができますか?
android - フラグメントが再開された後に onLoadFinished が再度呼び出されるのはなぜですか?
ローダーに特有の問題があります。現在、これが私のコードのバグなのか、ローダーを誤解しているのかはわかりません。
アプリ
この問題は会話で発生します (Whatsapp に似たものを想像してください)。私が使用するローダーは、 AsyncTaskLoader の例に基づいて実装されています。サポートライブラリを使用しています。
- OnCreate では、キャッシュされたメッセージを取得するローダーを開始します。
- CachedMessageLoader が終了すると、RefreshLoader を開始して最新のメッセージを (オンラインで) 取得します。
- 個別の ID としての各ローダー タイプ (たとえば、offline:1 online:2)
これは、次の例外を除いて、非常にうまく機能します。
問題
別のフラグメントを開き (そしてトランザクションをバックスタックに追加し)、Back-Key を使用して conversationFragment に戻ると、以前の両方の結果でonLoadFinished
再度呼び出されます。この呼び出しは、フラグメントがローダーを再度開始する前に発生します...
以前に取得した「古い」結果を配信すると、メッセージが重複します。
質問
- それらの結果が再度配信されるのはなぜですか?
- これらのローダーを間違って使用していますか?
- 結果を「無効化」して、結果が 1 回だけ配信されるようにすることはできますか? それとも、自分で重複を排除する必要がありますか?
呼び出しのスタック トレース
更新 1 ここで言及されているローダーは、会話フラグメントによって開始されます。
更新 2 My MainActivity (最終的にすべてのフラグメントをホストする) は、SherlockFragmentActivity をサブクラス化し、基本的に次のようなフラグメントを起動します。
会話フラグメントは、次のように「表示プロファイル」フラグメントを開始します。
android - ローダーの動作を確認する方法
ローダーがどのように動作しているかを確認しますか? isStared()
私を助けないでください。返却後onLoadFinished()
isStarted()
は必ずtrue
。