2011-09-19 19 views
8

AsyncTaskLoaderカスタムを使用してWebサービスからデータをダウンロードする場合、読み込みプロセスの途中でHOMEボタンを押してからもう一度アプリケーションを入力すると、onLoadFinished )メソッドは呼び出されません。私の断片はにsetRetainInstance(true)と呼ばれ、同じ方法(これはお勧め)でgetLoaderManager.initLoader(0, null, this)も呼びます。ホームボタンから戻るとonLoadFinishedが呼び出されない

テスト中に、フラグメントに戻ったときにこれが呼び出されないので、onLoadFinished()が呼び出されない可能性があります。しかし、他にどこにinitLoader()メソッドを置く?私はいくつかの場所でそれがonResume()で呼ばれるべきではないことを読んだ。

だから、どんなアイデアですか?私はアプリのさまざまな画面にたくさんのローダーを持っており、私はこの問題をエレガントな方法で解決する必要があります。

+0

'onResume()'はフレームワークのバグを回避するために必要なものですからhttps://code.google.com/p/android/issues/detail?id=63179 – faizal

+0

@faizal私は本当に覚えていません。私はずっと前にローダーを使用することから離れました。多くのエキスパート開発者は、ネットワークデータを取得するためにLoaderを使用することに対する経験から推薦します。 –

答えて

22

号14944(http://code.google.com/p/android/issues/detail?id=14944)を見た後、私は私のカスタムAsyncTaskLoaderonStartLoading()をオーバーライドすることによって、問題を解決し、forceLoad()を呼び出します。

アンでもよりよい解決策は、(上記のリンクからalexvemによって提案から取られた)このようになりますカスタム親AsyncTaskLoaderを作成することです:あなたはinitloader`が呼び出されるべきではない `という読みになりました

public abstract class AsyncLoader<D> extends AsyncTaskLoader<D> { 

    private D data; 

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

    @Override 
    public void deliverResult(D data) { 
     if (isReset()) { 
      // An async query came in while the loader is stopped 
      return; 
     } 

     this.data = data; 

     super.deliverResult(data); 
    } 


    @Override 
    protected void onStartLoading() { 
     if (data != null) { 
      deliverResult(data); 
     } 

     if (takeContentChanged() || data == null) { 
      forceLoad(); 
     } 
    } 

    @Override 
    protected void onStopLoading() { 
     // Attempt to cancel the current load task if possible. 
     cancelLoad(); 
    } 

    @Override 
    protected void onReset() { 
     super.onReset(); 

     // Ensure the loader is stopped 
     onStopLoading(); 

     data = null; 
    } 
} 
+0

onStartLoading()をオーバーライドしてforceLoad()を呼び出して解決しました。 – sandy

関連する問題