問題タブ [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.
android - AsyncTaskLoader が実行されているかどうかを確認する方法
私はAsyncTaskLoader
これを使って始めています:
これを使用して、実行中かどうかを判断できると思いました。
しかし、isRunning
常に戻りますtrue
。
android - 同じLoaderManagerを使用するCursorLoadersとAsyncTaskLoaders
複数のCursorLoaderを使用するフラグメントがあります。すべて正常に動作します。次に、同じフラグメントにAsyncTaskLoaderも追加する必要があります。
質問は、同じLoaderManager.LoaderCallbacksインターフェイスを使用してCursorLoadersとAsyncTaskLoaderの両方を管理するにはどうすればよいですか?
私の考えでは、CursorLoaderは-AsyncTaskLoaderであるため、LoaderCallBacksを両方に適応させることができるはずですが、ボートに乗り遅れる可能性があります...
android - AndroidでWebサービスからリクエストを取得する適切な方法
HTTP リクエストを使用して Web サービスからデータを取得する最良の方法はどれだろうと思っていました。AsyncTask または AsyncTaskLoader の使用
アクティビティで LoaderManager を使用して AsyncTaskLoader を使用していますが、構成の変更、特に向きの変更があると問題が発生します。ローダーが OnFinish() を呼び出すのを停止します。
より柔軟で独立した AsyncTask も試しましたが、まだ 2.2 だった以前のプロジェクトでうまく機能しますか? AsyncTaskLoader は 3.0---4.0 でより推奨されているため、ご意見をお寄せいただければ幸いです。
android - AsyncTaskLoader の 3 番目のタスクが消える
リスト項目をタップすると、詳細セクションが新しく選択された行に関連するデータをロードするリスト/詳細ワークフローを実装しようとしています。AsyncTaskLoader
これを達成するためにを使用しようとしています。3 つのリスト項目を続けて十分にすばやくタップすると、実際には 2 つのロードだけが行われ、3 つ目が失われるという問題が発生しています。
この動作を示すサンプル アクティビティを作成しました。ボタンを 3 回タップすると、loadInBackground()
メソッドは 2 回しか呼び出されません。どこかで電話に出られないのですか?
android - ダイアログ付きのAsyncTaskLoader、それは実行可能ですか?
私は新しいアプリを開始し、Androidの最新のパターンとガイドラインを使用したいと思いました。そのうちの1つは、AsyncTasksの代わりにローダー(AsyncTaskLoader)を使用することです。ローダーが、すべてのAsyncTasks「タスク」を実際に置き換えることになっているのかどうかを確認しようとしています。 "すなわち
REST呼び出しに基づいてアプリを構築したいとします。これらの呼び出しの1つが、ユーザーのログインを担当します。したがって、(フラグメントボタンで)[送信]をクリックすると、応答が返されるまでダイアログが表示されます。正しければ、AsyncTaskLoader onLoadFinishedを使用すると、ハンドラーを使用しない限りダイアログを閉じることができず、これをうまく使用すると、ソリューションは少しハッキーに見えます。その場合、ユーザー名またはパスワードが間違っている場合などのエラーダイアログを表示する必要があります。そうすると、ハンドラーへの呼び出しが大量に発生する可能性があります。
AsyncTaskを使用してこれを簡単に実行し、すべて正常に機能しました。すべてのコードをAsyncTaskLoaderに移動していたので、簡単なはずのときに多くのことをハッキングしているようです。私は初心者なので、しばらくお待ちください。答えます。
お時間をいただきありがとうございます。
android - AsyncTaskLoader onLoadFinished 保留中のタスクと構成の変更
AsyncTaskLoader
を使用してバックグラウンドでデータをロードし、選択されたリスト項目に応じて詳細ビューを作成しようとしています。おおむね動作するようになりましたが、まだ 1 つの問題があります。リストで 2 番目の項目を選択し、最初に選択した項目の読み込みが完了する前にデバイスを回転させると、onLoadFinished()
呼び出しは新しいアクティビティではなく停止中のアクティビティに報告されます。これは、単一のアイテムを選択してから回転する場合にうまく機能します。
これが私が使用しているコードです。アクティビティ:
リストフラグメント:
結果フラグメント:
プレーンな s を使用してこれを機能させることができましたが、構成の変更を自動的に処理するため、 sAsyncTask
についてさらに学習しようとしています。Loader
編集: LoaderManagerのソースを見て、問題を追跡した可能性があると思います。構成の変更後にinitLoader
が呼び出されると、期待どおり、LoaderInfo
オブジェクトのmCallbacks
フィールドが の実装として新しいアクティビティで更新されます。LoaderCallbacks
ただし、保留中のローダーがある場合、メインLoaderInfo
オブジェクトにもmPendingLoader
a への参照を持つフィールドがLoaderCallbacks
あり、このオブジェクトはフィールド内の新しいアクティビティで更新されませんmCallbacks
。代わりに、コードは次のようになると思います。
onLoadFinished
保留中のローダーが古いアクティビティ インスタンスを呼び出すのは、このためと思われます。このメソッドにブレークポイントを設定し、デバッガーを使用して欠落していると思われる呼び出しを行うと、すべてが期待どおりに機能します。
新しい質問は次のとおりです。バグを見つけましたか、それともこれは予期された動作ですか?
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()
Cursor
View
編集1
これを少し掘り下げた後、ここでの根本的な問題は、CursorAdapter
が基になる を処理する方法だと思いますCursor
。私はそれがどのように機能するかを理解しようとしています。
理解を深めるために、次のシナリオを取り上げます。
- がロード
CursorLoader
を終了しCursor
、現在 5 行の を返しているとします。 Adapter
は、これらの行の表示を開始します。を次の位置に移動しCursor
て呼び出すgetView()
- この時点で、リスト ビューがレンダリング中であっても、行 (_id = 2 など) がデータベースから削除されます。
- これが問題です-が削除された行に対応する位置に
CursorAdapter
移動しました。Cursor
メソッドはbindView()
引き続き this を使用してこの行の列にアクセスしようとしますがCursor
、これは無効であり、例外が発生します。
質問:
- この理解は正しいでしょうか?上記のポイント 4 に特に興味があります。ここでは、行が削除されたときに、
Cursor
要求しない限り更新されないという仮定を立てています。 - これが正しいと仮定すると、進行中
CursorAdapter
のイベントのレンダリングを破棄/中止し、代わりに新鮮な( andを介して返される) を使用するように依頼するにはどうすればよいですか?ListView
Cursor
Loader#onContentChanged()
Adapter#notifyDatasetChanged()
PSモデレーターへの質問: この編集は別の質問に移動する必要がありますか?
編集2
さまざまな回答からの提案に基づいて、 s がどのように機能するかについての私の理解に根本的な誤りがあったようLoader
です。次のことがわかります。
Fragment
またはAdapter
を直接操作するべきではありませんLoader
。- はデータのすべての
Loader
変更を監視し、データが変更されるたびAdapter
に新しいものを提供する必要があります。Cursor
onLoadFinished()
この理解を武器に、次の変更を試みました。- 一切の操作はありLoader
ません。現在、refresh メソッドは何もしません。
Loader
また、と の内部で何が起こっているかをデバッグするためContentObserver
に、次のように思いつきました。
Fragment
そして、ここに私のとのスニペットがありますLoaderCallback
これで、DB に変更 (行の追加/削除) があるたびに、のonChange()
メソッドをContentObserver
呼び出す必要があります - 正しいですか? 私はこれが起こっているのを見ません。私ListView
の変化は決して見られません。変更が見られるのは、 を明示的に呼び出しonContentChanged()
た場合だけLoader
です。
ここで何がうまくいかないのですか?
編集3
Loader
わかりましたので、から直接拡張するように書き直しましたAsyncTaskLoader
。DB の変更が更新されていることも、DB に行を挿入/削除するときに呼び出されるonContentChanged()
メソッドも表示されません:-(Loader
いくつかのことを明確にするために:
のコードを使用し
CursorLoader
、Cursor
. ここで、 への呼び出しをContentProvider
自分のDbManager
コードに置き換えました (次に、 を使用DatabaseHelper
してクエリを実行し、 を返しますCursor
)。Cursor cursor = AppGlobals.INSTANCE.getDbManager().getAllCameras();
データベースでの挿入/更新/削除は、
Loader
. ほとんどの場合、DB 操作はバックグラウンドService
で行われ、いくつかのケースではActivity
.DbManager
クラスを直接使用してこれらの操作を実行します。
私がまだ得ていないのは、行が追加/削除/変更されたことを誰が教えてくれるのですか? Loader
言い換えれば、どこでForceLoadContentObserver#onChange()
呼ばれますか?ローダーで、オブザーバーを次の場所に登録しますCursor
。
Cursor
これは、変更されたときに通知する責任があることを意味しmObserver
ます。しかし、私の知る限り、「カーソル」は、DBでデータが変更されたときに、それが指しているデータを更新する「ライブ」オブジェクトではありません。
これが私のローダーの最新の反復です。
android - AsyncTaskLoader で実行中の AsyncTask をキャンセルできません
ユーザーがホームボタンをクリックしたときに、(AsyncTaskLoader で) AsyncTask の実行をキャンセルしたい。これまでに作成したものは次のとおりです。
したがって、onStopLoading() で cancelLoad() を呼び出しています。これは現在のタスクをキャンセルする必要があると思いますが、AsyncTaskLoader の AsyncTask はまだ実行中です (loadInBackground() のループがまだ進行中です)。
問題は、「java.android.support.v4.content.AsyncTaskLoader.java」の cancelLoad() メソッドにある可能性があります。mTask.cancel(boolean) は、引数に「false」を指定して呼び出されます。
AsyncTaskLoader で AsyncTask の実行をキャンセルする機会はありますか?
android - AsyncTaskとThreadの本当の違い
私はこの問題についてAndroidのドキュメント(AsyncTask、Thread)とvogellaチュートリアルを読んでいますが、まだ疑問があります。
たとえば、Androidアプリからサーバーにメッセージを送信したいとします。そして、私はこのプロセスが敏感になることを望んでいます。何を使うべきですか?
ブロックされていないUIの新しいものを作成する例を見てきましたThread
が、この方法ではプロセスの進行状況がわかりません。また、メソッドが何も返さないThread
ため、内で応答を処理する必要があります。run()
AsyncTask
よりも良いオプションのようですが、の代わりにThread
を使用した場合の結果はわかりません。AsyncTask
Thread
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」に対して間違ったデータを返す理由について、状況を明らかにしているようには見えませんでした。