問題タブ [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 - ローテーション後にLoaderCallbacksが失われました
ローダーを使用するたびにこの問題が発生します。起動AsyncTaskLoader
してから画面を回転させても(1回でも数回でも構いません)onLoaderFinished()
呼び出されません。loadInBackground()
作業を終了しますがonLoaderFinished()
、呼び出されません。コールバックが欠落しているように見えますが、アクティビティでは次のようになりますonCreate()
。
コールバックがアクティビティまたはフィールドによって実装されているかどうかは関係ありません。私の場合、フィールドを使用します。
時々それはかなりうまくいくが、いくつかのデバイスでは私は再びこの問題を抱えている。
Androidのバグトラッカーで検索しましたが、何も役に立ちませんでした。
これは私の間違いですか、どうすれば修正できますか?
編集:
android - onLoadFinishedの後にリストアイテムが表示されない
私は次のシナリオで立ち往生しています。
私は2つのタブと2つのフラグメントを含むページラダプターを実装するアクティビティを実行し、互換性の目的でActionBarSherlockを使用しています。
問題のあるフラグメントはSherlockListFragmentから拡張され、LoaderManager.LoaderCallbacksを実装します。カスタムArrayListAdapterとAsyncLoaderを拡張するカスタムローダーを
作成しました。
問題は、ローダーがタスクのロードを終了したときに、リストビューが更新されず、空白のページしか表示されないことです。
私はこの解決策に従いましたが、それは私の問題を解決しません。
これは私のフラグメントレイアウトxmlファイルです。
そしてこれはカスタムローダーコードです
最後に、これはフラグメントクラスです
android - 1 つのアクティビティで異なる (AsyncTask) ローダーを使用する
アクティビティでさまざまな AsyncTaskLoaders (戻り値の型が異なる) を使用したいのですが、コールバック メソッドを実装する最良の方法は何ですか?
これはうまくいきません:
パブリック クラス MyActivity は Activity を拡張し、LoaderManager.LoaderCallbacks<MyPojo>、LoaderManager.LoaderCallbacks<MyOtherPojo> を実装します
エクリプス 言う
それで、私は何をしますか?私の考えは、アクティビティを作成することです
LoaderManager.LoaderCallbacks<Object> を実装します
次に、コールバック メソッドでそれがどのタイプのオブジェクトであるかを確認しますが、それはあまりエレガントではないようです。より良い方法はありますか?
android - バックグラウンドでlistViewアイテムをロードするためにAsyncTaskを使用することはまだ推奨されていますか?
バックグラウンド
AsyncTask よりも推奨される、バックグラウンドでデータをロードするための新しいソリューションがいくつかあると聞きました ( loaders など)。
問題
AsyncTasks は素晴らしく、使いやすいです。ただし、いくつかの制限があります。
保留中のタスクの数 (約 256 程度) によって制限されるため、クラス自体を変更する必要があります。もちろん、listView のアダプターでは、タスクが必要ない場合 (たとえば、別のアイテムに使用されたビューを更新する必要がある場合) は常にタスクをキャンセルします。
また、アクティビティ/フラグメントが再作成されているときに、それらをすべてキャンセルする (または別の方法で処理する) 必要があります。
1&2のため、それらを管理し、それらすべてを参照する必要があります
AsyncTask はタスクのキューを使用し、代わりにスタックを使用する必要がある場合もあるため、代わりにスタックを使用する独自の AsyncTask クラスを作成する必要がありました。
質問
AsyncTask の代替手段はありますか?
これは以前のいくつかの投稿で尋ねられたことは知っていますが (ここのように)、asyncTask に代わるバックグラウンドでデータをロードする新しい一般的な方法があるかどうかを考えていました。
ローダーについては、データベースと contentProvider に使用されるという考えだと思いますが、(たとえば) インターネットからのデータ (画像ファイルなど) の読み込みにも使用できますか?
また、Google によって作成された素敵なサンプル (ここでは "bitmapFun" と呼ばれます) もあります。これは、AsyncTask を使用していることがわかります (そして、おそらく私が言及したのと同じ理由で、それを拡張することさえあります)。しかし、多分私も何かを見逃していますか?
android - ローダーが結果を間違ったフラグメントに配信する
Android developer exampleに基づいて、ActionBar タブを使用してタブをスワイプするアクティビティがあります。
各タブには Fragment が表示され、各 Fragment (実際には SherlockFragment) は、カスタム AsyncTaskLoader を介して異なる種類のリモート API 要求を読み込みます。
問題は、移動しようとしているタブのフラグメント (古いフラグメント) が結果をロードしている間にタブをタップして 2 つのタブ/ページを移動すると、その結果が移動先のタブのフラグメント (新しいフラグメント)。私の場合、予想される結果が互換性のない型であるため、これは ClassCastException につながります。
コードでは、状況の要点は次のとおりです。
ローダー:
フラグメント:
タブ管理コードは前述の例のとおりです。Foo タブと Bar タブの間に 3 番目のタブがあります (Baz と呼びます)。FooFragment が LoaderManager で initLoader を呼び出した後、FooFragment.onLoadFinished が呼び出される前に、Bar タブをタップして Foo タブから Bar タブにスキップすると、BarFragment.onLoadFinished の呼び出しで ClassCastException が発生します。
なぜこれが起こっているのでしょうか?どうすれば防ぐことができますか? 同じ LoaderManager が Bar フラグメントで再利用されているようにデバッグ ログから見えますが (Baz フラグメントには独自のものがあります)、なぜそれが発生するのかわかりません。
更新:各フラグメントで異なるローダー ID を使用すると、クラッシュが解消されます (またはそう思われます - 理由はよくわかりません) が、私はむしろこれを行いません。フラグメントの 1 つで、実際に ID を動的に作成し、衝突がないと仮定したくありません。また、その解決策は私には奇妙です-ローダーIDは各フラグメントに対してローカルである必要があります(そうでなければ、通常の状況で異なるフラグメントに同じIDを持つローダーを使用できるのはなぜですか?)
setOffscreenPageLimit(2)
Bar ビューに切り替えたときに Foo ビューが破棄されないように、ViewPagerを呼び出してクラッシュを解消することもできるようです。ただし、これは回避策であり、一般的な解決策ではありません。
完全なコード:エラーを示すサンプル アプリケーションを作成しました。エラーを強制するmonkeyrunnerスクリプトが含まれています(ただし、すべての画面サイズで機能するとは限りません)。
android - カスタム ローダー - バックスタックからフラグメントが返されたときに呼び出される onStartLoading()
ViewPager と FragmentStatePageAdapter を使用して検索結果を表示し、結果の各セットを独自のフラグメントにしています。データは、カスタム AsyncTaskLoader を使用してロードされます。他のアクティビティに移動したり、バックグラウンドに移動して戻ってきたりするときに、スクロール位置を保持したい。
ただし、別のアクティビティに移動して戻ってくると、ローダー マネージャーはローダーの onStartLoading() を呼び出し、データを不必要に再読み込みします。
これは、スクロール位置を復元できないことも意味します(フラグメントの保存時に保存されます)。フラグメントの onResume でこのリロードを回避する方法はありますか? フラグメントがバックスタックから復元されたときに呼び出されない onActivityCreated() でのみ initLoader() を呼び出しています。
v4互換ライブラリを使用しています。
ありがとう!
android - Android - onLoadFinished が呼び出されていません
ローダーの問題に直面しています。
ローカル DB から取得したレコードのリストを表示するアクティビティがあります。アクティビティが開始されると、レコードは LoaderManager.initLoader() メソッドによって自動的にロードされます。
ActionBarSherlock の更新ボタンを使用してリストを手動で更新することもできます。ただし、DB にレコードを追加する別のアクティビティが終了した後、onLoadFinished は呼び出されません。
私はSimpleCursorLoaderを使用しています。アクティビティのコード スニペットは次のとおりです。
問題は、他のアクティビティを終了した後、呼び出されますonLoaderCreate
が、onLoaderFinished
呼び出されないことです。
いくつかのデバッグの後、それSimpleCursorAdapter.deliverResults()
も呼び出されていることがわかりました。つぼみは最終的に.. if (isReset()) { ..
何か不足していますか?データのリロードを強制する方法は?
前もって感謝します