#android #lifecycle
#Android #жизненный цикл
Вопрос:
У меня странная проблема с моим приложением —
У вас есть действие с фрагментом, которое содержит фрагмент — этот фрагмент запускает AsyncTask onCreate() и отменяет AsyncTask onStop() . Моя проблема возникает из-за того, что, хотя мой фрагмент остается запущенным и не скрыт, функция onStop() вызывается почти сразу после функции onCreate().
Кто-нибудь знает, как отследить, почему это происходит?
09-28 11:41:56.785: VERBOSE/SearchFragment1(924): onCreate()
09-28 11:41:56.796: VERBOSE/SearchFragment1(924): onStop()
Редактировать
Я удалил код из фрагмента, и я все еще совершенно сбит с толку — проблема сохраняется! Я добавил еще несколько строк ведения журнала:
09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onAttach()
09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onCreate()
09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onCreateView()
09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onActivityCreated()
09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onStart()
09-28 14:09:00.246: VERBOSE/SearchResultsFragment1(1789): onStop()
09-28 14:09:00.246: VERBOSE/SearchResultsFragment1(1789): onStart()
09-28 14:09:00.246: VERBOSE/SearchResultsFragment1(1789): onResume()
Приведенное выше поведение … сбивает с толку. Код, используемый в действии, выглядит следующим образом:
if(savedInstanceState == null)
{
try {
FragmentTransaction transaction= getSupportFragmentManager().beginTransaction();
Fragment currentFragment= (Fragment)Class.forName(getIntent().getAction()).newInstance();
transaction.replace(R.id.singlePane, currentFragment);
transaction.commit();
} catch ...
Это фрагмент в его нынешнем виде во время отладки:
private static final boolean LOGGING_ENABLED = true;
private static int global_creation_count = 0;
private int local_count = global_creation_count;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() local_count, "onAttach()");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
global_creation_count =1;
if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() local_count, "onCreate()");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() local_count, "onCreateView()");
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() local_count,
"onActivityCreated()");
}
@Override
public void onStart() {
super.onStart();
if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() local_count, "onStart()");
}
@Override
public void onResume() {
super.onResume();
if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() local_count, "onResume()");
}
// Fragment is active
@Override
public void onPause() {
super.onPause();
if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() local_count, "onPause()");
}
@Override
public void onStop() {
super.onStop();
if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() local_count, "onStop()");
}
@Override
public void onDestroyView() {
super.onDestroyView();
if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() local_count, "onDestroyView()");
}
@Override
public void onDestroy() {
super.onDestroy();
if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() local_count, "onDestroy()");
}
@Override
public void onDetach() {
super.onDetach();
if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() local_count, "onDetach()");
}
ПРАВКА2
Из кода кажется, что onStop() вызывается непосредственно после OnStart() . Я попытался проверить, вызывается ли он одновременно с OnStart(), добавив Thread.sleep(1000) в onCreateView() . Результат тот же, что заставляет меня полагать, что onStop() вызывается / вызывается непосредственно из процесса создания фрагмента.
ПРАВКА3
Отслеживание стека при прерывании onStop():
Я собираюсь попытаться прикрепить исходный код и пошагово выяснить, в чем проблема.
Ответ №1:
Все еще не знаю, что он пытался сделать… Я исследовал, где получить исходный код для класса, участвующего в вызове onStop(), и обнаружил, что источник для android-support-v4.jar поставляется в упаковке вместе с jar в SDK.
Однако после подключения этого источника я вскоре обнаружил, что он не синхронизирован и что мой android-support-v4.jar он сильно отличался от того, который поставлялся вместе с текущей версией SDK.
Замена jar на тот, который поставляется с SDK, мгновенно устраняет проблему, и после OnStart() onStop() не вызывается. Не уверен, какая ошибка была причиной этого, но последняя версия, похоже, исправляет это довольно легко.
Комментарии:
1. Спасибо — это причиняло мне много боли. Я предполагаю, что это была ошибка в старой версии библиотеки support.