問題タブ [android-loadermanager]
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 - LoaderManager の restartLoader メソッドでの NullPointerException
フラグメントに次の独自のインターフェイス実装があります。
FragmentActivity は、別の Fragment (選択リスト) が 1 つの項目を選択したことをこの Fragment に報告します。その後、ListFragment は報告された ID (_ReportId) を持つ新しいデータをロードする必要があります。
しかし、私はNullPoinerException
onCreateLoader-Method に行く前にこのコードに取り掛かります。LogCat は次のとおりです。
理由がわかりません。同じコード (ただし、他のリストの場合) は、他の FragmentActivity でも正常に機能します。
android - CursorLoaders について混乱し、カスタム SQLiteOpenHelper でそれらを使用する
私は、人々が行う必要があるさまざまなタスクのアラームを設定できるようにするアプリを作成しています。私の現在の計画は、すべての関連データを SQLite データベースに保存することです。そのために、SQLiteOpenHelper を拡張するクラスを作成し、取り込まなければならないと予想されるすべての CRUD を処理するメソッドをそのクラスに詰め込みました。すべての処理を 1 つのスレッドで行うのは一般的に悪い考えであることを知っていたので、私はスレッド間で作業を分離する方法を調べたところ、CursorLoader と LoaderManager が見つかりました。これらは Android 互換性ライブラリで利用できるため、理想的でした。ただし、LoaderManagerは、ドキュメントのチュートリアルで行く ContentProvider が必要なようですであり、他のアプリがデータにアクセスできるようにするつもりはなかったので、ContentProviders で何かをする必要があるとは思っていませんでした。ContentProvider がないと、データベースが CursorLoader にフィードするための Uri を取得する方法がわかりません。SQLiteOpenHelper を拡張するクラスを引き続き使用し、LoaderManager を実装して、UI スレッドからカーソルを離してすべての ListFragments を保持できるようにする方法はありますか?
android - LoaderManagerはデータをオフラインで取得し、次にオンラインで取得します
この優れたユーザビリティパターンに従いたいと思います。アプリはデータをオフラインで保存して応答を高速化し、新しいデータをオンラインで取得したときに更新します。
そして、私はで使用Loaders
しLoaderManager
ます。
さて、前述のアプローチを実装するための正しいアプローチは何Loaders
ですか?
現在、私は2つのアプローチを使用していますが、欠点があり、一般的にあまりエレガントではありません。
- SQLiteではなくアプリケーションコンテキストにデータを保存する
- 2つの別々の
AsyncTaskLoaders
-offlineLoader
とonlineLoader
。1つ目はSQLiteデータベースからデータをフェッチし、そこにある場合はすぐに表示し、2つ目は外部サーバーからデータをロードしてデータベース(offlineLoaderの場合)に書き込み、オフラインデータを置き換えます
私が本当に欲しいのは:
データをオフラインでフェッチしてLoaderManagerに返す単一のローダーですが、その後も引き続き機能し、準備ができたら新しいオンラインデータを返します。したがって、2回戻る必要があります-それも可能ですか?
java - AsyncTaskでLoaderManagerから返されたカーソルを使用する
onLoadFinished
(from )のコールバックでカーソルが返され、LoaderManager.LoaderCallbacks
このカーソルで(おそらくコストのかかる)後処理を実行したいと思います。だから、私AsyncTask
はこのカーソルを使用するを起動しています。ただし、次の例外を除いて断続的にクラッシュします。
私の疑惑は、これが管理されたカーソルであるため、バックグラウンドスレッドが終了する前にカーソル(UIスレッドのローダーによって管理されている)が閉じられているために発生していることです。言い換えられたコードは次のとおりです。
どちらかが可能ですか、
どういうわけか、カーソルにフラグを立てて、UIスレッドからカーソルが閉じられないようにします。
カーソルがまだ使用中であることをマネージャーに通知します。
複製されたインスタンスがマネージャーによって閉じられないように、複製します。
別の、さらに良い解決策は?
ただし、UIスレッドでこの後処理を実行することは、非常にコストがかかる可能性があるため、絶対にオプションではありません。
android - 2 つのカーソルローダーがデータを返すのを待ってから、戻りデータに依存する 3 つ目のカーソルローダーを開始するにはどうすればよいですか?
フラグメントとコンテンツ プロバイダーを使用してローカルの sqlite データベースにアクセスする Android アプリがあります。リストビューは、表示がクエリ結果に基づくように、複数のデータベース クエリに依存することがよくあります。3 つのカーソルローダーがあると仮定すると、ローダー 3 を実行する前にローダー 1 と 2 の両方が完了していることを確認するにはどうすればよいですか?
java - Android:CursorLoader、LoaderManager、SQLite
一部のメソッドが非推奨になっている古いアプリを更新しようとしています。dbからのデータを表示するListViewを使用する場合は、LoaderManager+CursorLoaderを使用する必要があることがわかりました。CursorLoaderはコンテンツプロバイダーと連携します。それで、私のデータベース内のすべてのテーブルについて、今すぐコンテンツプロバイダーを作成する必要がありますか?どして私がこんな事に ?私の知る限り、コンテンツプロバイダーは他のアプリケーションといくつかのデータベース情報を共有するために使用されていますが、私のアプリは情報を共有していません。だから私はコンテンツプロバイダーなしでCursorLoaderを使用できますか?
android - ListView でデータベース クエリを表示する際に、LoaderManager/CursorLoader コンボが正しく機能しないのはなぜですか?
私はこれに一日中取り組んでおり、すべてがどのように適合するかを理解しようとしており、うまく適合するようにコードを作り直しています。
だから私は私が持っているものをあなたに見せます。エラーはありません。空白です。
MyAgendaLoaderManager.java:
CalProvider.java:
それが重要な場合は、メイン アクティビティでそれを実行するコードを次に示します。
私はそれがどのように空白になるかわかりません。CursorLoader と LoaderManager の一部を意図的に空白のままにしたことを覚えておいてください。これは、エラーがあったことを確認するためにすべてを入力したくなかったためです。ではなかった。私が何を間違えたのかを理解する助けがあれば、大歓迎です。
編集:実際、考えてみると、アダプターがそれを保持するビューを作成するとき以外に、私が行っていることを特定のリストに実際に結びつけるものは何もありません。しかし、そのビューは通常のレイアウトの一部ではありません。多分それは私が持っているエラーですが、残念ながら私はそうする方法がわかりません.
android - setOnItemClickListener() 内で getLoaderManager() にアクセスして onItemClick() をオーバーライドする方法は?
そのため、そのスコープ内から getLoadManager にアクセスする方法にこだわっています。LoaderManager はそのポイントに到達する前に既に作成されているため、本当にやりたいことはカーソルを更新することだけですが、getLoaderManager() を呼び出す以外にそれを達成する方法は今のところありません。問題は、その範囲ではできないことです。何か案は?前もって感謝します。
android - CursorLoaderからカーソルを更新するにはどうすればよいですか?
だから私はとの両方を実装する私のを持っていMainDisplayActivity
ます。ここにAがあり、ContentProviderを使用してデータベースから取得したアジェンダ情報を入力します。カレンダーもあります。セルをクリックすると、議事録がクリックされた日で更新されるように設定しました。私の問題は、setOnItemClickListener()内で作成したローダーを再利用すると、作成している新しいカーソルで情報が更新されないことです。別のIDで新しいローダーを作成するだけで、1回は機能しますが、別の日をクリックすると、更新が停止します。問題は、カーソルにあります。ローダーからカーソルを更新して、新しいローダーを作成し続ける必要がないようにするにはどうすればよいですか?前もって感謝します!Activity
LoaderManager.LoaderCallbacks<Cursor>
ListView
GridView
onCreate()
MainDisplayActivity
MyクラスのonCreate()でローダーを作成するための最初の呼び出し:
これらはからオーバーライドされたメソッドですLoaderCallbacks<Cursor>
追加のコードが必要な場合は、遠慮なくお問い合わせください。助けてくれてありがとう!
android - CursorLoader で動作させるには、CursorAdapter(Context context、Cursor c、int フラグ) を何に設定しますか?
CursorAdapters
google docs は、最初のコンストラクターを使用しないことを指摘しています。
他に2つのオプションしかありません。
それは言う
自動再クエリを制御できるコンストラクタ。これは使用せず、代わりに CursorAdapter(Context, Cursor, int) を使用することをお勧めします。このコンストラクターを使用すると、FLAG_REGISTER_CONTENT_OBSERVER が常に設定されます。
と
これは、推奨されるコンストラクターであると述べています。
問題は、最後のコンストラクターで使用するフラグがFLAG_AUTO_REQUERY
(int 1) とFLAG_REGISTER_CONTENT_OBSERVER
(int 2) の 2 つしかないことです。バックグラウンドでの管理と更新に CursorLoader を使用しているため、使用FLAG_AUTO_REQUERY
しても意味がありません。ではFLAG_REGISTER_CONTENT_OBSERVER
、 を使用する場合は必要ありませんCursorLoader
。
今、私はCursorAdapter(Context context, Cursor c, int flags)
それが私のでうまく動作するようにするためにどの整数を渡すのCursorAdapter
ですか? 私が心配しているのは、古いカーソルを正しく管理する方法です。これを行う正しい方法が本当にわかりません。
を使用する場合はFLAG_REGISTER_CONTENT_OBSERVER
、 で何かを行う必要がありますonContentChanged()
が、 で使用swapCursor()
する場合LoaderManager
は、カーソルが閉じていないため、 を実行するだけで済みますadapter.swapCursor(cursor).close()
。onContentChanged()
しかし、それはinと競合しCursorAdapter
ますか? 目標は、メモリ リークを発生させず、効率的にすることです。