9

私の最近のSOの質問の1つで、誰かがLoader私のソリューションに使用することを提案しました. だからここで私は単純なものを実装する方法を理解しようとしていますAsyncTaskLoader

これが私が思いついたものです:

public class Scraper extends AsyncTaskLoader<List<Event>> {

    List<Event> lstEvents;

    public Scraper(Context context) {
        super(context);
    }

    public List<Event> loadInBackground() {

            //This is where I will do some work and return the data

    }

}

それが私が理解したすべてです。のドキュメントを読みましたAyncTaskLoaderが、そのような不可解で面倒なものに出会ったことはありません。何百万ものメソッドがあり、それらはすべて互いに相反するものであり、それらを見ると、それらが呼び出される順序、またはそれらをオーバーライドして呼び出す必要があるかどうかを推測することは不可能です. このタスクのライフサイクルは悪夢です。

私が探しているのは、単純にデータをスクレイピングして返すことです。また、すべてのデータを再度スクレイピングすることなく、次回すぐに返すことができるように、クラス変数に保存したいと思います。

開いているカーソル、ストリームなどはありません。単純な変数が呼び出されるだけですlstEvents(これは大きい可能性があります)。メモリをリークしてリソースを浪費したくないので、このタスクをいつどこで機能させるために何を閉じる/無効にする必要があるかを誰かが説明してくれるとうれしいです。

クラス変数のどこにデータを格納すればよいですか? メソッドの最後でそれを行うべきですかloadInBackground、それともメソッドでこれを行うべきdeliverResultですか?

この単純なシナリオでは、タスクがキャンセルされたかどうか、またはリセットされたかどうかを確認する必要がある場所はありますか?それとも、単にこれらのメソッドをオーバーライドしてAsyncTaskLoader処理させないでください。

誰かが知っていれば、いくつかの足場コードが役立ちます。ありがとうございます。

4

3 に答える 3

7

私の最近の SO の質問の 1 つで、ソリューションにローダーを使用することを誰かが提案しました。

それはおそらく良い提案ではありませんでした。

このタスクのライフサイクルは悪夢です。

言うまでもなく、契約では、データの変更を動的に検出し、Loaderを使用するものに更新を自動的に配信できることになっていることが示唆されています。あなたのようなシナリオ。LoaderContentProvider

率直に言って、私は単に an を使用してAsyncTask、それを良いと呼びます。

そうは言っても、私がSQLite データベース (sans )用に作成しLoader実装と、カスタム ローダーの例をご覧になることをお勧めします。実装する必要があるメソッド はとだけです。組み込みの実装が不十分な場合は必要になるかもしれません-あなたの場合、組み込みの実装で問題ないと思います。私の でわかるように、他のメソッドをいくつか追加することもできますが繰り返しになりますが、それらは必要ないと思います。ContentProviderSharedPreferencesloadInBackground()onStartLoading()deliverResult()AbstractCursorLoader

タスクがキャンセルされたかどうか、またはリセットされたかどうかを確認する必要がある場所はありますか、またはこれらのメソッドをオーバーライドして AsyncTaskLoader に処理させる必要はありません。

それを処理することから始めて、AsyncTaskLoader何らかの理由でそれらが必要であると判断した場合にのみ、それらについて心配してください.

于 2012-09-27T19:59:33.290 に答える
3

CommonsWare の回答からのすべての優れた情報に加えて、考慮すべきもう 1 つのことがあります。を実装するときは、ローダーまたは のサブクラスのいずれかでAsyncTaskLoader呼び出す必要があります。そうしないと、私の経験ではメソッドが呼び出されません。forceLoad()AsyncTaskLoaderloadInBackground()

ドキュメントの私の理解から、ローダーは、質問でスタブ化したように、メンバー変数の結果に固執することができます。onStartLoading()次に、キャッシュされた結果のリストをオーバーライドして確認できます。リストが null の場合、ローダーはforceLoad()それ自体を呼び出すことができます。

また、キャッシュ結果を実装する場合は、 が別のスレッドで呼び出されることに注意してloadInBackground()ください。そのため、メンバー変数へのアクセスを同期する必要がある場合があります。

于 2012-09-27T20:15:14.787 に答える