Выдача случайных фрагментов - PullRequest
3 голосов
/ 19 октября 2011

в моем методе oncreate у меня есть это

// Create new fragment and transaction
myFragment = new MyFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.downPart, myFragment);
transaction.commit();

Проблема заключается в том, что иногда она закрывает сообщение с этой ошибкой

Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.pakagename.pak1.MyFragmentsActivity: make sure class name exists, is public, and has an empty constructor that is public

но иногда это случайно, иногда я запускаю свое приложение и работает хорошо, и, например, оно работает, как 10 раз подряд, работает нормально, а затем, когда я запускаю, оно вылетает ... после этого снова работает

Я не могу понять, почему иногда это просто дает сбой, возможно ли сбой, если в фоновом режиме работают другие приложения, и они каким-то образом замедляют мой процессор или занимают много памяти, я действительно не понимаю этого случайного поведения .

1 Ответ

4 голосов
/ 17 марта 2012

Если вы добавите Fragment к FragmentManager, Android сохранит их состояние и воссоздаст их, если процесс приложения когда-либо будет остановлен, чтобы восстановить память и т. Д.другие приложения будут вызывать это.Когда вы вернетесь, он сможет воссоздать ваши фрагменты только в том случае, если, как говорится в сообщении об ошибке, имя класса фрагмента существует, является общедоступным и имеет пустой открытый конструктор.*, но я предполагаю, что одно из этих условий не соответствует действительности.В частности, вполне вероятно, что MyFragment является (нестатичным) внутренним классом вашей деятельности.Внутренний класс может быть создан только внутри экземпляра внешнего класса, но Android делает это из другого контекста, когда воссоздает ваш фрагмент.Вот почему сложно иметь Fragment в качестве внутреннего класса.

Чтобы исправить это, убедитесь, что MyFragment является либо статическим внутренним классом, либо его собственным классом, а конструктор общедоступен (или нет).присутствует; будет использоваться по умолчанию).Статический внутренний класс может существовать без экземпляра своего внешнего класса (и не имеет доступа ни к каким переменным экземпляра).

Вы можете довольно легко это проверить, нажав home после запуска приложения (onSaveInstanceState будетназывается), убивая процесс с помощью DDMS, затем перезапуская ваше приложение.В качестве альтернативы, попробуйте выполнить свои оригинальные шаги, в результате чего вы откроете много других промежуточных приложений.

...