2016-03-27 2 views
0

После получения ответа с Volley я должен вернуться к основному фрагменту. У меня есть два разных запроса волейбола, в зависимости от некоторого состояния, я назову его «а» в этом примере. Странная вещь, когда a == 1, popBackStack успешно меняет на основной фрагмент. Когда a == 0 сбой, и я получаю java.lang.IllegalStateException Fragment not attached to Activity Я попытался создать новый основной фрагмент (transaction.commit ....), но это не помогло.java.lang.IllegalStateException Фрагмент, не привязанный к действию

if(a == 0) 
{ 
    VolleyManager.add(jsnObj, 
     new RequestListener() { 

        @Override 
        public <T> void onSuccess(T object) { 
         mFragmentManager.popBackStack(DataManager.BACK_STACK_KEY_MAIN_FRAGMENT, 0); 
        } 
        }); 
       } 
else if(a==1) 
{ 
    VolleyManager.update(jsnObj, 
     new RequestListener() { 

       @Override 
       public <T> void onSuccess(T object) { 
         mFragmentManager.popBackStack(DataManager.BACK_STACK_KEY_MAIN_FRAGMENT, 0); 
       } 
       }); 
    } 

Ошибка -

java.lang.IllegalStateException: Fragment MainFragment{6aaaf7f} not attached to Activity 
    at android.app.Fragment.getResources(Fragment.java 

Проблема, кажется, с getResources(), но я делаю то же самое, когда == 1 и у меня нет никаких проблем.

+0

Вы можете разместить весь журнал ошибок. –

+0

Я вижу крах внутри 'MainFragment', вы также можете обновить его код. –

+0

Я обновил его. спасибо – BVtp

ответ

0

getResources() должно быть вызвано от чего-то, что имеет Context, как и деятельность. Сам фрагмент не имеет Context, так как он не реализует его. Если вы используете getResources() в фрагменте, вы можете попробовать это:

String streetFormat = getActivity().getResources().getString(R.string.address_name_string); 
+1

Это не работает. Это не сбой, но он не возвращается к MainFragment. Я просто вижу пустую страницу. – BVtp

+1

Ну, это просто означает, что некоторая другая ваша логика не хороша. Мы исправили сбой, вызванный 'getResources()' – Vucko

3

Похоже, что к тому времени AsyncTask отделки и вызывает onPostExecute, то MainFragment был отделен от его activity. Таким образом, либо activity уже уничтожен, либо fragment не был прикреплен.

Так что, если фрагмент не присоединен к activity, он не может получить доступ к ресурсам, потому что требует context и фрагмент не имеет, но activity делает.

Итак, вы должны проверить, activity - null или нет до звонка getResources.

Обновить код как это:

if(getActivity()!=null){ 
    String streetFormat = getActivity().getResources().getString(R.string.address_name_string); 
    .... 
} 
+0

. Он не работает. Он не сбой, но он не возвращается к MainFragment. Я просто вижу пустую страницу. – BVtp

+0

Тогда вы не загружаете фрагмент. добавьте код, как вы добавляете 'MainFragment' –

+0

Я обновил сообщение. – BVtp

2

Вы должны отменить свои запросы на

onDestroyView()

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

onDestroyView(){ Volley.cancelAllRequests() } 

или

onResponse(){ if(getActivity() != null && isAdded(){ // here handle the response and update views, otherwise just cache the response!}} 
+0

Вы не можете предложить onDestroyView для прерывания HTTP-звонков. Мы должны уничтожить все запросы при вызове callback onStop, вызываемом системой. – nurisezgin

+0

@nurisezgin Тогда что происходит, когда ожидающий запрос отменяется в onStop, а затем пользователь нажимает на него? Видит неинициализированную страницу и запрос не обрабатывается! – MohammadReza

+0

Это документ Google для отмены запросов на волейбол. fyi https://developer.android.com/training/volley/simple.html#cancel – nurisezgin

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