15

У меня есть фрагмент, и хотите, чтобы начать загрузчик при нажатии кнопки:Загрузчик не запускается после вызова 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."; 
    } 
} 

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

Благодаря

ответ

6

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

Вы можете найти ответ на этот предыдущий вопрос полезным: Loaders in Android Honeycomb

2

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

+0

OMG, вы буквально исправили всю мою проблему. – Alex

32

Вам необходимо реализовать onStartLoading() и позвонить по телефону forceLoad() где-нибудь в этом методе.

Смотрите эту должность для получения дополнительной информации: Implementing Loaders (part 3)

+0

Это действительно сработало. Благодаря! – Roboblob

+0

Что мне следует внедрить в метод forceLoad()? –

+0

@Manikanta В ответе говорится, что вы должны _call_ 'forceLoad()', а не реализовывать его. –

2

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

3

Три важные моменты, касающиеся загрузчики:

  1. Всегда используйте forceLoad() метод во время инициализации погрузчиков. Например:

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

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

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

Смежные вопросы