4

AsyncTaskLoaderローダーの実行中に、方向の変更によりアクティビティが破棄されているときに、長時間実行されるタスクがあり、コールonLoadFinishedバックが呼び出されません。

どうにかしてローダーを新しいアクティビティ/コールバックに「再接続」できますか?

これが私の(簡略化された)アクティビティです:

public class DashboardActivity extends BaseActivity {

StartupCallback startupCallback;
    boolean loading = false; 

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.empty_viewpager);
    startupCallback = new StartupCallback();

    if (!loading){
         getSupportLoaderManager().initLoader(GlobalApp.giveId(), null,
                startupCallback);
                 loading = true; 
    }
}


private class StartupCallback implements
        LoaderManager.LoaderCallbacks<Boolean> {
    @Override
    public void onLoadFinished(Loader<Boolean> loader, Boolean succ) {

        Log.d("LOG", "onLoadFinished"); 
    }

    @Override
    public Loader<Boolean> onCreateLoader(int id, Bundle args) {

        return new StartupLoader(getApplicationContext());
    }

    @Override
    public void onLoaderReset(Loader<Boolean> loader) {

    }
}

}

ローダーがデータベース関連の作業を行い、同じデータベースで動作する 2 つのローダーがアプリをクラッシュさせるため、別のローダーを新しいコールバックで開始することはできません。

4

3 に答える 3

9

向きの変更中、アクティビティは破棄されて再作成されますが、ローダーはそうではありません。

initLoader() の呼び出しが、必ずしも別のローダーを開始するとは限らないことに注意してください。特定の ID でアドレス指定されたローダーが存在する場合、それはLoaderManager によって再利用され、コールバックが再度アタッチされます。したがって、(!loading) 条件を削除して、すべてのonCreate() コールバックで initLoader を呼び出すことができます。ローダーの ID が同じであることを確認してください。

ローダーガイドも参照

于 2013-05-13T15:13:05.063 に答える
1

ドキュメントから、id が最初に渡したものと同じである限り、新しいローダーではなく現在のローダーを返す必要があります: android docs

于 2013-05-13T15:12:53.323 に答える