java.lang.IllegalStateException: Fragment nie dołączony do aktywności

Rzadko pojawia się ten błąd podczas wywoływania API.

java.lang.IllegalStateException: Fragment  not attached to Activity

Próbowałem umieścić kod w metodzie isAdded(), aby sprawdzić, czy fragment jest obecnie dodawany do jego aktywności, ale wciąż rzadko pojawia się ten błąd. Nie rozumiem, dlaczego wciąż dostaję ten błąd. Jak Mogę temu zapobiec?

Jego wyświetlanie błędu na linii -

cameraInfo.setId(getResources().getString(R.string.camera_id));

Poniżej znajduje się przykładowe wywołanie api, które wykonuję.

SAPI.getInfo(getActivity(),
                new APIResponseListener() {
                    @Override
                    public void onResponse(Object response) {


                        cameraInfo = new SInfo();
                        if(isAdded()) {
                            cameraInfo.setId(getResources().getString(R.string.camera_id));
                            cameraInfo.setName(getResources().getString(R.string.camera_name));
                            cameraInfo.setColor(getResources().getString(R.string.camera_color));
                            cameraInfo.setEnabled(true);
                        }


                    }

                    @Override
                    public void onError(VolleyError error) {
                        mProgressDialog.setVisibility(View.GONE);
                        if (error instanceof NoConnectionError) {
                            String errormsg = getResources().getString(R.string.no_internet_error_msg);
                            Toast.makeText(getActivity(), errormsg, Toast.LENGTH_LONG).show();
                        }
                    }
                });
Author: Y.S., 2015-02-23

12 answers

Ten błąd występuje z powodu połączonego wpływu dwóch czynników:

  • żądanie HTTP, po zakończeniu, wywołuje onResponse() lub onError() (które działają w głównym wątku), nie wiedząc, czy Activity jest nadal na pierwszym planie, czy nie. Jeśli Activity zniknął (użytkownik poruszał się gdzie indziej), getActivity() zwraca null.
  • Volley Response jest wyrażona jako anonimowa Klasa wewnętrzna, która w domyśle ma silne odniesienie do klasy zewnętrznej Activity. Powoduje to klasyczną pamięć przeciek.

Aby rozwiązać ten problem, należy zawsze zrobić:

Activity activity = getActivity();
if(activity != null){

    // etc ...

}

A także użyj isAdded() w metodzie onError():

@Override
public void onError(VolleyError error) {

    Activity activity = getActivity(); 
    if(activity != null && isAdded())
        mProgressDialog.setVisibility(View.GONE);
        if (error instanceof NoConnectionError) {
           String errormsg = getResources().getString(R.string.no_internet_error_msg);
           Toast.makeText(activity, errormsg, Toast.LENGTH_LONG).show();
        }
    }
}
 151
Author: Y.S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-02 12:59:35

Cykl życia fragmentu jest bardzo złożony i pełen błędów, spróbuj dodać:

Activity activity = getActivity(); 
if (isAdded() && activity != null) {
...
}
 37
Author: Miroslav Michalec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-23 11:50:50

Znalazłem bardzo proste rozwiązanie isAdded () metoda, która jest jedną z metod fragment, aby zidentyfikować, że ten obecny fragment jest dołączony do jego aktywności, czy nie.

Możemy tego używać wszędzie w klasie fragment jak:

if(isAdded())
{

// using this method, we can do whatever we want which will prevent   **java.lang.IllegalStateException: Fragment not attached to Activity** exception.

}
 9
Author: Dharmesh Baldha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-03 20:54:55

Mogę się spóźnić, ale mogę komuś pomóc ..... Najlepszym rozwiązaniem jest utworzenie globalnej instancji klasy aplikacji i wywołanie jej w konkretnym fragmencie, w którym Twoja aktywność nie jest dołączana

Jak poniżej

icon = MyApplication.getInstance().getString(R.string.weather_thunder);

Oto Klasa aplikacji

public class MyApplication extends Application {

    private static MyApplication mInstance;
    private RequestQueue mRequestQueue;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }

    public static synchronized MyApplication getInstance() {
        return mInstance;
    }
}
 7
Author: md gouse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-07 17:10:31

Wyjątek: java.lang.IllegalStateException: Fragment

DeadlineListFragment {ad2ef970} niezwiązany z aktywnością

Kategoria: Cykl Życia

Opis: podczas wykonywania czasochłonnej operacji w wątku tła (np. AsyncTask), w międzyczasie został utworzony nowy Fragment i został odłączony od aktywności przed zakończeniem wątku tła. Kod w wątku UI (np. onPostExecute) wywołuje odłączony Fragment, rzucając taki wyjątek.

Rozwiązanie Fix:

  1. Anuluj wątek tła podczas zatrzymywania lub zatrzymywania Fragment

  2. Użyj isadded (), aby sprawdzić, czy fragment jest dołączony a następnie uzyskać źródła () z aktywności.

 5
Author: Rahil Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-09 15:53:51

Ten błąd może się zdarzyć, jeśli tworzysz instancję fragmentu, którego w jakiś sposób nie można utworzyć:

Fragment myFragment = MyFragment.NewInstance();


public classs MyFragment extends Fragment {
  public void onCreate() {
   // Some error here, or anywhere inside the class is preventing it from being instantiated
  }
}

W moim przypadku spotkałem się z tym, gdy próbowałem użyć:

private String loading = getString(R.string.loading);
 2
Author: sagits,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-01 13:38:03

Przyjęłam następujące podejście do tej kwestii. Utworzono nową klasę, która działa jako opakowanie dla metod aktywności takich jak Ta

public class ContextWrapper {
    public static String getString(Activity activity, int resourceId, String defaultValue) {
        if (activity != null) {
            return activity.getString(resourceId);
        } else {
            return defaultValue;
        }
    }

    //similar methods like getDrawable(), getResources() etc

}

Teraz, gdziekolwiek chcę uzyskać dostęp do zasobów z fragmentów lub działań, zamiast bezpośrednio wywoływać metodę, używam tej klasy. W przypadku, gdy aktywność context nie jest null Zwraca wartość zasobu, a jeśli context jest null, przekazuje wartość domyślną (która jest również określona przez wywołujący funkcja).

Ważne to nie jest rozwiązanie, to jest skuteczny sposób, w którym możesz poradzić sobie z tą awarią z gracją. Chciałbyś dodać kilka dzienników w przypadkach, w których otrzymujesz instancję activity jako null i spróbuj to naprawić, jeśli to możliwe.

 1
Author: Ezio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-18 06:49:53

Dzieje się tak, gdy fragment nie ma kontekstu, dlatego metoda getActivity()zwraca null. sprawdź, czy używasz kontekstu, zanim go otrzymasz, lub czy aktywność już nie istnieje . użyj kontekstu we fragmencie.onCreate i po odpowiedzi api zwykle przypadek ten problem

 0
Author: dexian fan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-14 04:03:55

Czasami ten wyjątek jest spowodowany błędem w implementacji biblioteki wsparcia. Ostatnio musiałem obniżyć wersję z 26.1.0 do 25.4.0, aby się go pozbyć.

 0
Author: Bord81,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-07 12:52:38

Jeśli używasz fragmentu

private HomePageActivity homePageActivity;

@Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        mView = inflater.inflate(R.layout.fragment_wish_list, container, false);

        initializeViews();

rowTextView.setBackgroundColor(homePageActivity.getResources().getColor(R.color.colorPrimary));


        return mView;
    }

private void initializeViews() {
        homePageActivity = (HomePageActivity) getActivity();
}


 @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof HomePageActivity) {
            homePageActivity = (HomePageActivity) context;
        }
    }
 0
Author: Ashwin H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-02 04:41:03

Ten problem występuje za każdym razem, gdy wywołujesz kontekst, który jest niedostępny lub null, gdy go wywołujesz. Może to być sytuacja, gdy wywołujesz kontekst głównego wątku aktywności w wątku tła lub kontekst wątku tła w głównym wątku aktywności.

Na przykład zaktualizowałem ciąg moich preferencji współdzielonych, jak poniżej.

editor.putString("penname",penNameEditeText.getText().toString());
editor.commit();
finish();

I wywołał finish() zaraz po nim. Teraz robi to tak, że As commit działa na głównym wątku i zatrzymuje wszelkie inne commity asynchroniczne, jeśli przyjdą do niego wykończenia. Tak więc jego kontekst jest żywy aż do zakończenia zapisu. Stąd poprzedni kontekst jest aktywny, powodując wystąpienie błędu.

Więc upewnij się, że Twój kod został ponownie sprawdzony, jeśli jest jakiś kod mający ten problem z kontekstem.

 0
Author: Prashant Paliwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-07 12:10:34

In Fragment use isAdded() Zwróci true, jeśli fragment jest aktualnie dołączony do aktywności.

Jeśli chcesz sprawdzić wewnątrz aktywności

 Fragment fragment = new MyFragment();
   if(fragment.getActivity()!=null)
      { // your code here}
      else{
       //do something
       }

Mam nadzieję, że to komuś pomoże

 0
Author: Prateek218,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-08 06:33:21