0

インターネットからデータを取得するListFragmentAsyncTaskLoaderがあります。ListFragmentは BaseAdapter によって埋められます

データの読み込み中、BaseAdapterは最初の行を回転するプログレス バーで埋めます。データがロードされ、エラーが発生しなかった場合、データはListViewに入力されます。しかし、何らかのエラーが発生した場合 ( AsyncTaskLoaderにそのエラーを示すフラグがあります)、BaseAdapterは最初の行にエラー メッセージを入力します。

問題:

ロードにエラーが発生した場合、LoaderManagerは自動的にデータを再ロードしようとします (forceLoad()呼び出されます)。これは良いことです。しかし、データがロードされていることをBaseAdapterに通知して、 BaseAdapterがエラー メッセージをプログレス バーの回転に変更できるようにする必要があります。

LoaderManagerが呼び出しているときにフラグメントを通知する簡単な方法はありますforceLoad()か?

私のおすすめ:

ListFragment は以下のインターフェースを実装し、この ListFragment を AsyncTaskLoader のコンストラクターに渡します。

public interface LoadingListener {
    public void onLoadingStatusChanged(boolean isLoading);
}

それから私は電話をかけることがonLoadingStatusChanged(true)できloadInBackground()ます。AsyncTaskLoader で Fragment への参照を保持すると、そのフラグメントがリークする可能性があります。onLoadingStatusChanged(false)deliverResult(T data)

4

1 に答える 1

0

提案された実装は、物事を処理するための優れた方法です。とのコールバックはLoader既に存在しますが、追加する必要があるのは開始されたコールバックだけです。いつでもトリガーするか、逆に呼び出されるカスタム コールバックを実装することもできます。これは、既存のフレームワーク コールバックをより厳密に反映します。OnLoadCompleteOnLoadCanceledOnLoadStartonForceLoad()onStartLoad()loadInBackground

フレームワークのコールバックと同様に、コンストラクターでリスナーを渡すのではなく、リスナーを登録および登録解除するメソッドを設定することをお勧めします。これにより、フラグメントは通常のライフサイクルの一部としてそれ自体をアタッチ/削除でき、参照はリークしません。 . あなたが述べたように、それを削除する方法なしでコンストラクターに渡すと、リークと見なされます。

于 2012-12-01T04:10:44.523 に答える