Загрузчик не запускается после вызова initLoader()?

У меня есть фрагмент и вы хотите запустить загрузчик при нажатии кнопки:

public class MyFragment extends Fragment {

    public void onActivityCreated() {
        super.onActivityCreated();

        Button btn = ...;
        btn.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                getLoaderManager().initLoader(500, null, mMyCallback);
            }
        });
    }  

    private LoaderManager.LoaderCallbacks<String> mMyCallback = new  LoaderManager.LoaderCallbacks<String>() {

        @Override
        public Loader<String> onCreateLoader(int arg0, Bundle arg1) {
            Log.e(TAG, "LoaderCallback.onCreateLoader().");
            return new MyLoader(getActivity());
        }
    }
}

public class MyLoader extends AsyncTaskLoader<String> {
    public MyLoader(Context context) {
        super(context);
    }

    @Override
    public String loadInBackground() {
        Log.e(TAG, "Hi, running.");
        return "terrific.";
    }
}

После нажатия кнопки я могу вызвать вызов callback onCreateLoader, но созданный загрузчик никогда не запускается. Нужно ли нам вызвать forceLoad() на самом загрузчике, чтобы запустить его? Ни один из этих сообщений не делает этого,

Спасибо

Ответы

Ответ 1

Вам нужно реализовать onStartLoading() и вызвать forceLoad() где-то в этом методе.

См. это сообщение для получения дополнительной информации: Реализация загрузчиков (часть 3)

Ответ 2

По моему опыту, он никогда не работал, если я не использовал forceLoad().

Вы можете найти ответ на этот предыдущий вопрос: Погрузчики в Android Honeycomb

Ответ 3

Три важных момента для погрузчиков:

  • Всегда используйте метод forceLoad() при инициализации Loaders. Например:

    getLoaderManager().initLoader(500, null, mMyCallback).forceLoad();
    
  • Всегда выполняйте onStartLoading(). Эта функция будет автоматически вызываться LoaderManager при запуске соответствующего фрагмента/активности.

  • Убедитесь, что идентификатор загрузчика уникален, иначе новый Loader не будет вызываться.

Если по-прежнему существует проблема, вы можете проверить состояние загрузчика, вызвав метод isStarted().

Ответ 4

Вам нужно сохранить ссылку на экземпляр загрузчика, созданного в методе onCreateLoader. Затем, чтобы обновить его, вызовите yourLoader.onContentChanged();

Ответ 5

Если у вас более одного загрузчика в одном и том же действии, убедитесь, что их идентификатор отличается. Я потерял несколько часов, чтобы понять это:)