問題タブ [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.

0 投票する
1 に答える
1032 参照

android - デバイスの回転によるViewPagerとLoaderManagerのエラー

そこに3つのフラグメントがあるViewPagerを使用します。追加は、LoaderManagerを使用して各フラグメントデータをロードします。独自のローダーを実装しましたが、デバイスを回転させてローダータブが実際に選択されている場合、ページャーとローダーの組み合わせはNullPointerExceptionで実行されます。これは私のlogcatです。

java.lang.NullPointerException android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:960)android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.java:768)android.support.v4.app.FragmentManagerImpl .startPendingDeferredFragments(FragmentManager.java:1104)android.support.v4.app.LoaderManagerImpl $ LoaderInfo.onLoadComplete(LoaderManager.java:410)android.support.v4.content.Loader.deliverResult(Loader.java:103)com.android .droidfridge.loader.FridgeLoader.deliverResult(FridgeLoader.java:144)com.android.droidfridge.loader.FridgeLoader.deliverResult(FridgeLoader.java:1)android.support.v4.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:221 )android.support.v4.content.AsyncTaskLoader $ LoadTask.onPostExecute(AsyncTaskLoader.java:61)android.support.v4.content。ModernAsyncTask.finish(ModernAsyncTask.java:461)android.support.v4.content.ModernAsyncTask.access $ 500(ModernAsyncTask.java:47)android.support.v4.content.ModernAsyncTask $ InternalHandler.handleMessage(ModernAsyncTask.java:474)

これが私の完全なローダーコードです:

0 投票する
1 に答える
2012 参照

android - UIスレッドでのonQueryCompleteへのAsyncQueryHandlerの呼び出し? (アンドロイド)

私は使用しており、クエリが完了するAsyncQueryHandlerと呼び出されます。onQueryComplete

私の質問: onQueryCompleteUI スレッドで呼び出されますか?

バックグラウンドでクエリを実行することはわかっています。

AsyncQueryHandlerインスタンス化された場所は重要ですか?(UI スレッドでインスタンス化された場合は、UI スレッドonQueryCompleteで呼び出されることを意味します)。

0 投票する
1 に答える
479 参照

android - AsyncTaskLoader の 3 番目のタスクが消える

リスト項目をタップすると、詳細セクションが新しく選択された行に関連するデータをロードするリスト/詳細ワークフローを実装しようとしています。AsyncTaskLoaderこれを達成するためにを使用しようとしています。3 つのリスト項目を続けて十分にすばやくタップすると、実際には 2 つのロードだけが行われ、3 つ目が失われるという問題が発生しています。

この動作を示すサンプル アクティビティを作成しました。ボタンを 3 回タップすると、loadInBackground()メソッドは 2 回しか呼び出されません。どこかで電話に出られないのですか?

0 投票する
1 に答える
744 参照

android - ダイアログ付きのAsyncTaskLoader、それは実行可能ですか?

私は新しいアプリを開始し、Androidの最新のパターンとガイドラインを使用したいと思いました。そのうちの1つは、AsyncTasksの代わりにローダー(AsyncTaskLoader)を使用することです。ローダーが、すべてのAsyncTasks「タスク」を実際に置き換えることになっているのかどうかを確認しようとしています。 "すなわち

REST呼び出しに基づいてアプリを構築したいとします。これらの呼び出しの1つが、ユーザーのログインを担当します。したがって、(フラグメントボタンで)[送信]をクリックすると、応答が返されるまでダイアログが表示されます。正しければ、AsyncTaskLoader onLoadFinishedを使用すると、ハンドラーを使用しない限りダイアログを閉じることができず、これをうまく使用すると、ソリューションは少しハッキーに見えます。その場合、ユーザー名またはパスワードが間違っている場合などのエラーダイアログを表示する必要があります。そうすると、ハンドラーへの呼び出しが大量に発生する可能性があります。

AsyncTaskを使用してこれを簡単に実行し、すべて正常に機能しました。すべてのコードをAsyncTaskLoaderに移動していたので、簡単なはずのときに多くのことをハッキングしているようです。私は初心者なので、しばらくお待ちください。答えます。

お時間をいただきありがとうございます。

0 投票する
2 に答える
1122 参照

android - onLoadFinishedメソッドでアクティビティを開始します

私は持っDialogFragmentていLoaderます。

ダイアログは、ユーザーにアプリケーションからログアウトするように促します。

ユーザーがログアウトすることを選択するLoaderと、設定とデータベースをクリアする起動し、現在のを終了しますActivity

終了後、ログイン画面でLoader新しく始めたいのですがActivity、2つの問題が発生します。

  1. getActivity()メソッドはnull
  2. Activity私は外れているので、私は新しく走ることができませんActivity context

これに対する解決策はありますか?

0 投票する
4 に答える
6712 参照

android - AsyncTaskLoader onLoadFinished 保留中のタスクと構成の変更

AsyncTaskLoaderを使用してバックグラウンドでデータをロードし、選択されたリスト項目に応じて詳細ビューを作成しようとしています。おおむね動作するようになりましたが、まだ 1 つの問題があります。リストで 2 番目の項目を選択し、最初に選択した項目の読み込みが完了する前にデバイスを回転させると、onLoadFinished()呼び出しは新しいアクティビティではなく停止中のアクティビティに報告されます。これは、単一のアイテムを選択してから回転する場合にうまく機能します。

これが私が使用しているコードです。アクティビティ:

リストフラグメント:

結果フラグメント:

プレーンな s を使用してこれを機能させることができましたが、構成の変更を自動的に処理するため、 sAsyncTaskについてさらに学習しようとしています。Loader


編集: LoaderManagerのソースを見て、問題を追跡した可能性があると思います。構成の変更後にinitLoaderが呼び出されると、期待どおり、LoaderInfoオブジェクトのmCallbacksフィールドが の実装として新しいアクティビティで更新されます。LoaderCallbacks

ただし、保留中のローダーがある場合、メインLoaderInfoオブジェクトにもmPendingLoadera への参照を持つフィールドがLoaderCallbacksあり、このオブジェクトはフィールド内の新しいアクティビティで更新されませんmCallbacks。代わりに、コードは次のようになると思います。

onLoadFinished保留中のローダーが古いアクティビティ インスタンスを呼び出すのは、このためと思われます。このメソッドにブレークポイントを設定し、デバッガーを使用して欠落していると思われる呼び出しを行うと、すべてが期待どおりに機能します。

新しい質問は次のとおりです。バグを見つけましたか、それともこれは予期された動作ですか?

0 投票する
5 に答える
10357 参照

android - カスタム CursorLoader と ListView をサポートする CursorAdapter の間でデータが同期していない

バックグラウンド:

CursorLoaderを使用する代わりに、SQLite データベースで直接動作するカスタムがありContentProviderます。このローダーは、 にListFragment裏打ちされた で動作しCursorAdapterます。ここまでは順調ですね。

簡単にするために、UI に [削除] ボタンがあると仮定します。ユーザーがこれをクリックすると、DB から行を削除onContentChanged()し、ローダーも呼び出します。また、onLoadFinished()コールバック時にnotifyDatasetChanged()、UI を更新するためにアダプターを呼び出します。

問題:

削除コマンドが立て続けに実行される場合、つまり が立て続けにonContentChanged()呼び出されると、bindView()古いデータを操作することになります。これは行が削除されたことを意味しますが、ListView はまだその行を表示しようとしています。これにより、カーソル例外が発生します。

私は何を間違っていますか?

コード:

これはカスタムの CursorLoader です ( Diane Hackborn 氏によるこのアドバイスに基づく)

コールバックListFragmentを示すクラスのスニペット。LoaderManagerユーザーがレコードを追加/削除するたびにrefresh()呼び出すメソッド。

Myは、オーバーライドされて新しく膨張した行レイアウト XML を返し、を使用して列を行レイアウトの s にバインドするCursorAdapter通常のものです。newView()bindView()CursorView


編集1

これを少し掘り下げた後、ここでの根本的な問題は、CursorAdapterが基になる を処理する方法だと思いますCursor。私はそれがどのように機能するかを理解しようとしています。

理解を深めるために、次のシナリオを取り上げます。

  1. がロードCursorLoaderを終了しCursor、現在 5 行の を返しているとします。
  2. Adapterは、これらの行の表示を開始します。を次の位置に移動しCursorて呼び出すgetView()
  3. この時点で、リスト ビューがレンダリング中であっても、行 (_id = 2 など) がデータベースから削除されます。
  4. これが問題です-が削除された行に対応する位置にCursorAdapter移動しました。CursorメソッドはbindView()引き続き this を使用してこの行の列にアクセスしようとしますがCursor、これは無効であり、例外が発生します。

質問:

  • この理解は正しいでしょうか?上記のポイント 4 に特に興味があります。ここでは、行が削除されたときに、Cursor要求しない限り更新されないという仮定を立てています。
  • これが正しいと仮定すると、進行中CursorAdapterのイベントのレンダリングを破棄/中止し、代わりに新鮮な( andを介して返される) を使用するように依頼するにはどうすればよいですか?ListView CursorLoader#onContentChanged()Adapter#notifyDatasetChanged()

PSモデレーターへの質問: この編集は別の質問に移動する必要がありますか?


編集2

さまざまな回答からの提案に基づいて、 s がどのように機能するかについての私の理解に根本的な誤りがあったようLoaderです。次のことがわかります。

  1. FragmentまたはAdapterを直接操作するべきではありませんLoader
  2. はデータのすべてのLoader変更を監視し、データが変更されるたびAdapterに新しいものを提供する必要があります。CursoronLoadFinished()

この理解を武器に、次の変更を試みました。- 一切の操作はありLoaderません。現在、refresh メソッドは何もしません。

Loaderまた、と の内部で何が起こっているかをデバッグするためContentObserverに、次のように思いつきました。

Fragmentそして、ここに私のとのスニペットがありますLoaderCallback

これで、DB に変更 (行の追加/削除) があるたびに、のonChange()メソッドをContentObserver呼び出す必要があります - 正しいですか? 私はこれが起こっているのを見ません。私ListViewの変化は決して見られません。変更が見られるのは、 を明示的に呼び出しonContentChanged()た場合だけLoaderです。

ここで何がうまくいかないのですか?


編集3

Loaderわかりましたので、から直接拡張するように書き直しましたAsyncTaskLoader。DB の変更が更新されていることも、DB に行を挿入/削除するときに呼び出されるonContentChanged()メソッドも表示されません:-(Loader

いくつかのことを明確にするために:

  1. のコードを使用しCursorLoaderCursor. ここで、 への呼び出しをContentProvider自分のDbManagerコードに置き換えました (次に、 を使用DatabaseHelperしてクエリを実行し、 を返しますCursor)。

    Cursor cursor = AppGlobals.INSTANCE.getDbManager().getAllCameras();

  2. データベースでの挿入/更新/削除は、Loader. ほとんどの場合、DB 操作はバックグラウンドServiceで行われ、いくつかのケースではActivity. DbManagerクラスを直接使用してこれらの操作を実行します。

私がまだ得ていないのは、行が追加/削除/変更されたことを誰が教えてくれるのですか? Loader言い換えれば、どこでForceLoadContentObserver#onChange()呼ばれますか?ローダーで、オブザーバーを次の場所に登録しますCursor

Cursorこれは、変更されたときに通知する責任があることを意味しmObserverます。しかし、私の知る限り、「カーソル」は、DBでデータが変更されたときに、それが指しているデータを更新する「ライブ」オブジェクトではありません。

これが私のローダーの最新の反復です。

0 投票する
2 に答える
4206 参照

android - FragmentActivity から Fragment 内の RestartLoader

ListFragment の外側から restartLoader() を呼び出すと、少し問題が発生します。シーケンスは、アクティビティを開く [追加] ボタンをタップ -> データを入力 -> [保存] をタップし、サーバーにデータを保存するための AsyncTask を開始します。データ転送が成功したら、前のアクティビティに戻ります -> getLoaderManager().restartLoader() を実行する ListFragment 内のメソッドをアクティビティに呼び出します。

これにより、必ず「java.lang.IllegalStateException: Fragment ListsFragment{42481238} not attached to Activity」エラーが発生します。restartLoader() を onResume に移動すると、動作が少し改善されますが、ListFragments に接続されたデータを直接変更する他のボタンがあり、何があっても IllegalStateException をトリガーします。

logcat からのエラー メッセージの抜粋

私は何が欠けていますか?この例外をトリガーせずに FragmentActivity から ListFragment を更新するにはどうすればよいですか?

0 投票する
1 に答える
198 参照

android - 以前の状態を記憶している Android アクティビティ ListView LoaderManager ナビゲーション

ListView を生成するランチャー アクティビティがあります。

ListView には、基本的に位置と ID を新しいアクティビティに渡す setOnItemClickListener があります。

現在、ActivityHome の ListView は、ListView の途中に表示されています。

ActivityDetail にいて、actionBar.setDisplayHomeAsUpEnabled(true); がある場合。以下が実行されると、ActivityHomeに戻ります

問題は、ListView 内の位置が失われ、ListView が先頭に戻ることです。onCreate() の実行を停止し、ActivityDetail の Activity を破棄して、ActivityHome に戻って元の状態に戻す方法はありますか? ご理解いただければ幸いです。

インテントに対してフラグを間違って設定した可能性があると思います...

0 投票する
1 に答える
701 参照

android - Android ローダーをデイジーチェーン接続するのは悪い考えですか?

オンラインで 2 つのソースからデータを取得する必要があり、それぞれの進捗状況を表示したいと考えています。データが収集されたら、リストビューに入力できます。

私の現在の実装は、MyActivity が LoaderCallbacks を実装し、それが MyDataLoader (AsyncTaskLoader を拡張するクラス) のインスタンスを作成することです。MyDataLoader の loadInBackground メソッドでは、すべてのソースからデータをフェッチし、Sqlite db に入力します。このデータベースは全体で使用できます。

問題は、プロセスのどこにいるのかについてユーザーにフィードバックを提供していないことです。

そのため、getLoaderManager().initLoader を使用してローダーをデイジーチェーン接続し、ローダーを作成してから、ローダーマネージャー内のローダーを 1 つずつ反復処理することを考えていました。各ローダーが終了して onLoadFinished に戻ると、progressDialog のテキストを設定して進行状況を示すことができます。

これは悪い考えですか?もっと簡単で良い方法はありますか?