問題タブ [asynctaskloader]

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 に答える
857 参照

android - AsyncTaskLoader が実行されているかどうかを確認する方法

私はAsyncTaskLoaderこれを使って始めています:

これを使用して、実行中かどうかを判断できると思いました。

しかし、isRunning常に戻りますtrue

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

android - 同じLoaderManagerを使用するCursorLoadersとAsyncTaskLoaders

複数のCursorLoaderを使用するフラグメントがあります。すべて正常に動作します。次に、同じフラグメントにAsyncTaskLoaderも追加する必要があります。

質問は、同じLoaderManager.LoaderCallbacksインターフェイスを使用してCursorLoadersとAsyncTaskLoaderの両方を管理するにはどうすればよいですか?

私の考えでは、CursorLoaderは-AsyncTaskLoaderであるため、LoaderCallBacksを両方に適応させることができるはずですが、ボートに乗り遅れる可能性があります...

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

android - AndroidでWebサービスからリクエストを取得する適切な方法

HTTP リクエストを使用して Web サービスからデータを取得する最良の方法はどれだろうと思っていました。AsyncTask または AsyncTaskLoader の使用

アクティビティで LoaderManager を使用して AsyncTaskLoader を使用していますが、構成の変更、特に向きの変更があると問題が発生します。ローダーが OnFinish() を呼び出すのを停止します。

より柔軟で独立した AsyncTask も試しましたが、まだ 2.2 だった以前のプロジェクトでうまく機能しますか? AsyncTaskLoader は 3.0---4.0 でより推奨されているため、ご意見をお寄せいただければ幸いです。

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 投票する
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 に答える
4164 参照

android - AsyncTaskLoader で実行中の AsyncTask をキャンセルできません

ユーザーがホームボタンをクリックしたときに、(AsyncTaskLoader で) AsyncTask の実行をキャンセルしたい。これまでに作成したものは次のとおりです。

したがって、onStopLoading() で cancelLoad() を呼び出しています。これは現在のタスクをキャンセルする必要があると思いますが、AsyncTaskLoader の AsyncTask はまだ実行中です (loadInBackground() のループがまだ進行中です)。

問題は、「java.android.support.v4.content.AsyncTaskLoader.java」の cancelLoad() メソッドにある可能性があります。mTask.cancel(boolean) は、引数に「false」を指定して呼び出されます。

AsyncTaskLoader で AsyncTask の実行をキャンセルする機会はありますか?

0 投票する
6 に答える
25847 参照

android - AsyncTaskとThreadの本当の違い

私はこの問題についてAndroidのドキュメント(AsyncTaskThread)とvogellaチュートリアルを読んでいますが、まだ疑問があります。

たとえば、Androidアプリからサーバーにメッセージを送信したいとします。そして、私はこのプロセスが敏感になることを望んでいます。何を使うべきですか?

ブロックされていないUIの新しいものを作成する例を見てきましたThreadが、この方法ではプロセスの進行状況がわかりません。また、メソッドが何も返さないThreadため、内で応答を処理する必要があります。run()

AsyncTaskよりも良いオプションのようですが、の代わりにThreadを使用した場合の結果はわかりません。AsyncTaskThread

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

android - AsyncTaskLoader はどのようにデータをキャッシュしますか?

このコードのすべてが存在するフラグメントを実装するアクティビティがあります。コードは機密であるため、これは例を使用して説明するのが最適です。この例は、やろうとしていることと、私がテストで観察したことを反映しています

例) ローダー ID (ローダー 1、ローダー 2) を持つ 2 つの一意のローダーから 2 つの一意のオブジェクト (A、B) をフェッチする rss リーダー フラグメントがあります。

作成時に、オブジェクト A を取得するローダー 1 で「initloader」を呼び出します。利用可能な記事をスクロールした後、オブジェクト A から返された partialArcticlePreviewList の一番下に到達し、オブジェクト B を取得してユーザーを許可するローダー 2 の「restartloader」を使用して、さらに記事を取得します。それらを読み、すべての記事に対してこれを続けます。

これは、ユーザーがデバイスを回転させて onCreate を呼び出すまでは正常に機能します。initloader がローダー 1 で呼び出されると、ローダー 1 に接続した後、すぐに onLoadFinished にジャンプし、ローダー 1 を返します。articleIds は適切に返されますが、返される partialArcticlePreviewList は、オブジェクト B をフェッチしたローダー 2 からのものです。

ローダー マネージャーはオブジェクトのインスタンスを 1 つだけキャッシュに保持し、それを複数のローダー間で共有しますか? 広範なテスト (5 時間以上かけて問題を見つけ、Eclipse デバッガーでローダー ID/キャッシュ/アドレスを調べた) から、ローダー 1 の partialArcticlePreviewList が、ローダー 2 の partialArcticlePreviewList で受け取ったデータで上書きされたように見えます。この状況は単一のローダーにとって理想的ですが、各ローダーのキャッシュは別々になると考えていました。明らかに、ローダーの利点の 1 つは、使いやすさと、画面の回転とデータ キャッシュによる持続性ですが、暗示どおりには機能していないようです。私達'

編集: 追加するのを忘れました。互換性ライブラリ v4 を使用しています。また、ローダーのアンドロイドソースを見ても、ローダーが「mId」に対して間違ったデータを返す理由について、状況を明らかにしているようには見えませんでした。