2013-06-06 2 views
2

У меня есть приложение для Android с TabManager. Из-за изменения API Android мне нужно обновить мое приложение для Activity, чтобы он содержал фрагмент. Чтобы обеспечить обратную совместимость, я использую ActionBarSherlock.Чтобы использовать getSherlockActivity() или getActivity() или другое?

Мое приложение работает нормально. Тем не менее, глядя на консоль разработчика Google Play, всегда есть несколько отчетов о сбоях в «java.lang.NullPointerException» в строке с помощью getSherlockActivity(), я думаю, что затронуто всего менее 0,1% от общего числа пользователей.

Например,

// Example 1  
File file = new File(getSherlockActivity().getCacheDir(), "filename"); 
// Example 2 
getSherlockActivity().setSupportProgressBarIndeterminateVisibility(false); 

Мой вопрос: 1. Должен ли я изменить все getSherlockActivity() для getActivity()? Или по определенному правилу обязательно использовать один из них? 2. В чем разница между ними?

Большое спасибо.

+3

Низкая частота ошибок говорит мне, что это может быть признаком того, что ваша деятельность была разрушена ОС ОС из-за ограничений ресурсов, а затем повторно создана, когда пользователь возвращается к ней, но не восстановлен должным образом (как правило, потому что состояние активности не сохраняется правильно). Вы можете проверить это, включив опцию разработчика «Не выполнять действия», а затем переключаясь между своей деятельностью и другим приложением, а затем обратно. Я считаю полезным сделать большую часть моей работы dev/test с включенным включением, он очищает угловые случаи, которые вы в противном случае не заметили бы до тех пор, пока не появятся отчеты о сбоях. – Phil

+0

Спасибо всем. Удалось устранить проблему, вызванную onPostExecute AsyncTask после уничтожения Activity (нажатие кнопки возврата). Но мне интересно, почему процесс фрагментации все еще может работать, поскольку его активность уже уничтожена? – neobie

+0

Это будет связано с тем, что AsyncTask - это просто асинхронный - и живет за пределами Activity (или Fragment), который его начал. Процитировать с сайта developer.android.com - «AsyncTasks в идеале следует использовать для коротких операций». Если задача не завершилась до того, как действие будет уничтожено, я бы сказал, что он слишком длинный. В AsyncTask JavaDoc предлагаются альтернативные подходы к работам с длительным фоном. По сути, AsyncTask должен выполнять «настоящую работу» с потока пользовательского интерфейса и останавливать чувство пользовательского интерфейса. – Phil

ответ

2

Единственная разница в том, что с getSherlockActivity() вы получаете результат getActivity(), но вызывается как Шерлок. Это позволяет получить доступ к специфичной для АБС АИС.

Если вам просто нужно что-то достаточно общее, чтобы быть в классе Activity, просто используйте getActivity(). Это подчеркнет это, в противном случае подчеркнуть тот факт, что вы используете что-то специфическое для ABS, используя getSherlockActivity().

NPE может исходить от:

  • используя getActivity() (или братьев и сестер ...) перед onAttach была выполнена
  • с помощью getActivity() (или братьев и сестер ...) после того, как onDetach была выполнена

Таким образом, решение, чтобы проверить, если ваш фрагмент присоединен перед использованием его деятельности:

if(isAttached()) { 
    getActivity().... 
} 
1

Это исключение, вероятно, означает, что код вызывается, когда фрагмент не связан с активностью.

Ссылка, возвращаемая функцией getSherlockActivity(), устанавливается, когда Фрагмент прикреплен, а затем очищается (устанавливается в null), когда фрагмент отсоединен. Если ваш код пытается ссылаться на getSherlockActivity() до или после этого, вы получите нулевой указатель.

2

Same topic

NullPointerException является normally

Внимание: Если вам нужен объект контекста в пределах вашего фрагмента, вы можете вызвать getActivity(). Однако будьте осторожны, чтобы вызвать getActivity() только тогда, когда фрагмент привязан к активности. Когда фрагмент еще не прикреплен или был отсоединен в конце его жизненного цикла, getActivity() вернет значение null.

0

getSherlockActivity просто ярлык:

(SherlockActivity) getActivity() 

Так что в вашем случае нет никаких проблем, чтобы использовать getActivity() вместо этого в примере 1, но в примере 2, он не будет работать, так как это метод SherlockActivity ,

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