android.support.v4.app.Fragment.setUserVisibleHint puntatore null sulla ripresa di app

Sto ottenendo un incidente sul ripristino dell'applicazione nel codice frammenti. Non ho mai visto questo crash, ma ho ricevuto rapporti di crash dagli utenti tramite TestFlight. Suppongo che c'è qualcosa che mi manca perché il codice funziona bene sulla maggior parte delle macchine. Qualsiasi aiuto sarebbe molto apprezzato.

Ecco lo stack di chiamate.

  • Come allineare il titolo o l'etichetta in attività?
  • Come aggiungere titolo, snippet e icona a ClusterItem?
  • Differenza tra FragmentPagerAdapter e FragmentStatePagerAdapter
  • Come salvare lo stato di un Android CheckBox quando gli utenti esce dall'applicazione?
  • 'Attributo content descriptore mancante nell'image' nell'XML
  • Come posso controllare direttamente il mio dispositivo Android con il supporto wifi?
  • java.lang.NullPointerException android.support.v4.app.Fragment.setUserVisibleHint in Fragment.java on Line 819 android.support.v4.app.FragmentPagerAdapter.setPrimaryItem in FragmentPagerAdapter.java on Line 130 android.support.v4.view.ViewPager.populate in ViewPager.java on Line 1066 android.support.v4.view.ViewPager.populate in ViewPager.java on Line 914 android.support.v4.view.ViewPager.onMeasure in ViewPager.java on Line 1436 android.view.View.measure in View.java on Line 15323 android.view.ViewGroup.measureChildWithMargins in ViewGroup.java on Line 4924 android.widget.LinearLayout.measureChildBeforeLayout in LinearLayout.java on Line 1421 android.widget.LinearLayout.measureVertical in LinearLayout.java on Line 698 android.widget.LinearLayout.onMeasure in LinearLayout.java on Line 579 android.view.View.measure in View.java on Line 15323 android.view.ViewGroup.measureChildWithMargins in ViewGroup.java on Line 4924 android.widget.FrameLayout.onMeasure in FrameLayout.java on Line 315 android.view.View.measure in View.java on Line 15323 android.support.v4.widget.DrawerLayout.onMeasure in DrawerLayout.java on Line 639 android.view.View.measure in View.java on Line 15323 android.view.ViewGroup.measureChildWithMargins in ViewGroup.java on Line 4924 android.widget.FrameLayout.onMeasure in FrameLayout.java on Line 315 android.view.View.measure in View.java on Line 15323 android.view.ViewGroup.measureChildWithMargins in ViewGroup.java on Line 4924 android.widget.LinearLayout.measureChildBeforeLayout in LinearLayout.java on Line 1421 android.widget.LinearLayout.measureVertical in LinearLayout.java on Line 698 android.widget.LinearLayout.onMeasure in LinearLayout.java on Line 579 android.view.View.measure in View.java on Line 15323 android.view.ViewGroup.measureChildWithMargins in ViewGroup.java on Line 4924 android.widget.FrameLayout.onMeasure in FrameLayout.java on Line 315 com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure in PhoneWindow.java on Line 2155 android.view.View.measure in View.java on Line 15323 android.view.ViewRootImpl.performMeasure in ViewRootImpl.java on Line 1854 android.view.ViewRootImpl.measureHierarchy in ViewRootImpl.java on Line 1102 android.view.ViewRootImpl.performTraversals in ViewRootImpl.java on Line 1275 android.view.ViewRootImpl.doTraversal in ViewRootImpl.java on Line 1000 android.view.ViewRootImpl$TraversalRunnable.run in ViewRootImpl.java on Line 4218 android.view.Choreographer$CallbackRecord.run in Choreographer.java on Line 725 android.view.Choreographer.doCallbacks in Choreographer.java on Line 555 android.view.Choreographer.doFrame in Choreographer.java on Line 525 android.view.Choreographer$FrameDisplayEventReceiver.run in Choreographer.java on Line 711 android.os.Handler.handleCallback in Handler.java on Line 615 android.os.Handler.dispatchMessage in Handler.java on Line 92 android.os.Looper.loop in Looper.java on Line 137 android.app.ActivityThread.main in ActivityThread.java on Line 4744 java.lang.reflect.Method.invokeNative(Native Method) java.lang.reflect.Method.invoke in Method.java on Line 511 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run in ZygoteInit.java on Line 786 com.android.internal.os.ZygoteInit.main in ZygoteInit.java on Line 553 dalvik.system.NativeStart.main(Native Method) 

    In primo luogo ho impostato il pager di visualizzazione nella function OnResume dell'attività.

     private void initialiseViewPager() { mLoginFragment = new WeakReference<LoginFragment>(new LoginFragment()); Bundle loginBundle = new Bundle(); loginBundle.putInt("SpinnerIndex", HDMSLiveSession.getInstance().getSpinnerPosition()); loginBundle.putString("UserName", HDMSLiveSession.getInstance().getUsername()); loginBundle.putString("Password", HDMSLiveSession.getInstance().getPassword()); loginBundle.putInt("Mode", HDMSLiveSession.getInstance().getConnectionMode().ordinal()); loginBundle.putBoolean("LoggedIn", HDMSLiveSession.getInstance().isLoggedIn()); loginBundle.putBoolean("Connected", HDMSLiveSession.getInstance().isConnected()); loginBundle.putString("LoginResult", HDMSLiveSession.getInstance().getLoginResult()); loginBundle.putString("System", HDMSLiveSession.getInstance().getSystem()); loginBundle.putInt("code", HDMSLiveSession.getInstance().getAccessCode()); loginBundle.putLong("bytesSent", mCurrentSB); loginBundle.putLong("bytesReceived", mCurrentRB); loginBundle.putLong("nbytesSent", mNCurrentSB); loginBundle.putLong("nbytesReceived", mNCurrentRB); loginBundle.putInt("appid", mApp.getApplicationInfo().uid); loginBundle.putString(mWebSocketAddressPreference, mConnect.getWebSocketURL()); loginBundle.putString(mAPIAddressPreference, mLogin.getLiveServerURL()); loginBundle.putBoolean(mAutoLoginPreference, mAutoLoginEnabled); loginBundle.putBoolean(mAutoConnectPreference, mLogin.isAutoConnectEnabled()); loginBundle.putInt(mAutoReconnectTimePreference, mConnect.getAutoReconnectTime()); loginBundle.putInt(mMaxAutoReconnectionAttemptsPreference, mConnect.getMaxAutoReconnectionAttempts()); loginBundle.putInt(mPingResponseTimePreference, mConnect.getPingResponseTime()); loginBundle.putInt(mAutoPingTimePreference, mConnect.getAutoPingTime()); loginBundle.putInt(mCurrentPingPreference, mConnect.getCurrentPing()); loginBundle.putInt(mAutoReconnectAttemptsPreference, mConnect.getAutoReconnectAttempts()); loginBundle.putInt(mAutoReconnectTotalAttemptsPreference, mConnect.getAutoReconnectTotalAttempts()); loginBundle.putBoolean(mPlayListMessagePreference, messageSubscriptionContains(mPlayListMessage)); loginBundle.putBoolean(mAutoPageSwapPreference, mAutoPageSwap); loginBundle.putBoolean(mWifiCheckedPreference, mWifiChecked); loginBundle.putBoolean(mAutoWebCheckedPreference, mConnect.isAutoWebChecked()); loginBundle.putBoolean(mGatewayCheckedPreference, mGatewayChecked); loginBundle.putBoolean(mDHS1CheckedPreference, mDNS1Checked); loginBundle.putBoolean(mHDMSLiveCheckedPreference, mHDMSLiveChecked); loginBundle.putBoolean(mGoogleCheckedPreference, mGoogleChecked); loginBundle.putBoolean(mHDMSCheckedPreference, mHDMSChecked); loginBundle.putBoolean(mParrotCheckedPreference, mParrotChecked); loginBundle.putBoolean(mLocalIPCheckedPreference, mLocalIPChecked); loginBundle.putString(mLocalIPPreference, mLocalIP); loginBundle.putInt(mMaxImagesFromWebPreference, mMaxImagesFromWeb); loginBundle.putInt(mMaxPingAttemptsPreference, mConnect.getMaxPingAttempts()); loginBundle.putInt(mFailedPingsPreference, mConnect.getFailedPings()); loginBundle.putBoolean("AutoLogin", mLogin.isAutoLogin()); loginBundle.putBoolean("wasLoggedIn", HDMSLiveSession.getInstance().wasLoggedIn()); mLoginFragment.get().setArguments(loginBundle); mBAUFragment = new WeakReference<BAUFragment>(new BAUFragment()); Bundle bauBundle = new Bundle(); bauBundle.putBoolean("jump", mJumpToCurrent); bauBundle.putInt("place", mBAUPosition); bauBundle.putBoolean(mBAUExpandedPreference, mBAUExpanded); mBAUFragment.get().setArguments(bauBundle); mPlayerFragment = new WeakReference<PlayerFragment>(new PlayerFragment()); mListFragment = new WeakReference<ListFragment>(new ListFragment()); Bundle listBundle = new Bundle(); listBundle.putInt(mListModePreference, mListMode); mListFragment.get().setArguments(listBundle); mSearchFragment = new WeakReference<SearchFragment>(new SearchFragment()); Bundle searchBundle = new Bundle(); searchBundle.putInt(mSearchModePreference, mSearchMode); searchBundle.putString("searchQueryA", mSearchTextA); searchBundle.putString("searchQueryS", mSearchTextS); searchBundle.putString("titleLast", mTitleLast); searchBundle.putString("artistLast", mArtistLast); searchBundle.putString("listLast", mListLast); searchBundle.putString("yearLast", mYearLast); searchBundle.putString("genreLast", mGenreLast); mSearchFragment.get().setArguments(searchBundle); mVideoFragment = new WeakReference<VideoFragment>(new VideoFragment()); Bundle videoBundle = new Bundle(); videoBundle.putInt(mVideoOutputPreference, mVideoOutput); mVideoFragment.get().setArguments(videoBundle); List<Fragment> fragments = new Vector<Fragment>(); fragments.add(mVideoFragment.get()); fragments.add(mPlayerFragment.get()); fragments.add(mBAUFragment.get()); fragments.add(mListFragment.get()); fragments.add(mSearchFragment.get()); fragments.add(mLoginFragment.get()); mPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(), fragments); mViewPager = (ViewPager)findViewById(R.id.contentViewPager); mViewPager.setAdapter(mPagerAdapter); mViewPager.setOnPageChangeListener(this); mViewPager.setVisibility(View.VISIBLE); ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); if (am.getMemoryClass() >= 32) mViewPager.setOffscreenPageLimit(Fragments.Max.ordinal()); mLastFragment = -1; UpdateDisplay(); } 

    Tutti i frammenti vengono conservati a less che non sia un dispositivo con un piccolo mucchio di memory. Attualmente ci sono 6 frammenti, l'incidente si è verificato quando lì where solo 4 in memory. Così so che il numero di frammenti non è il problema. Ho provato a lasciare le impostazioni predefinite delle impostazioni di visualizzazione pagine visualizzatrici, l'unica differenza è la velocità in cui l'applicazione deve caricare frammenti quando l'utente passa. Tutti i frammenti vengono distrutti quando l'applicazione viene interrotta.

     @Override protected void onSaveInstanceState(Bundle outState) { FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); if (mLoginFragment.get() != null) ft.remove(mLoginFragment.get()); if (mPlayerFragment.get() != null) ft.remove(mPlayerFragment.get()); if (mBAUFragment.get() != null) ft.remove(mBAUFragment.get()); if (mListFragment.get() != null) ft.remove(mListFragment.get()); if (mSearchFragment.get() != null) ft.remove(mSearchFragment.get()); if (mVideoFragment.get() != null) ft.remove(mVideoFragment.get()); ft.commit(); mLoginFragment = new WeakReference<LoginFragment>(null); mPlayerFragment = new WeakReference<PlayerFragment>(null); mBAUFragment = new WeakReference<BAUFragment>(null); mListFragment = new WeakReference<ListFragment>(null); mSearchFragment = new WeakReference<SearchFragment>(null); mVideoFragment = new WeakReference<VideoFragment>(null); mPagerAdapter = null; mViewPager = null; mFragmentsLoaded = 0; mLastFragment = -1; } 

    Ecco il mio codice pager di vista.

     package com.hdms.manager.Fragments; /** * Created by bradj on 8/10/13. * */ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.app.FragmentTransaction; import android.view.View; import java.util.List; public class ViewPagerAdapter extends FragmentPagerAdapter { private final List<Fragment> mFragments; FragmentManager mFragmentManager; public ViewPagerAdapter(FragmentManager aFragmentManager, List<Fragment> aFragments) { super(aFragmentManager); mFragmentManager = aFragmentManager; mFragments = aFragments; } @Override public Fragment getItem(int aPosition) { return mFragments.get(aPosition); } @Override public long getItemId(int aPosition) { return aPosition; } @Override public void destroyItem(android.view.ViewGroup aContainer, int aPosition, java.lang.Object aObject) { if (aPosition <= getCount() && aObject != null) { FragmentTransaction trans = mFragmentManager.beginTransaction(); trans.remove((Fragment) aObject); trans.commit(); } } @Override public int getCount() { return mFragments.size(); } } 

  • Richiesta multipla di POST di lavoro con Volley e senza HttpEntity
  • Android SearchView.OnQueryTextListener OnQueryTextSubmit non sparato sulla string di query vuota
  • Memorizzazione di database SQLite utilizzando Android e Phonegap
  • Come registrare una chiamata in android?
  • Distriggers il button Home in android
  • Schermo bianco prima dello splashscreen
  • 2 Solutions collect form web for “android.support.v4.app.Fragment.setUserVisibleHint puntatore null sulla ripresa di app”

    Finalmente! Sono ora in grado di ricreare in modo affidabile questo errore!

    Per ricreare l'errore, chiudere l'attività / app e riaprire rapidamente la pagina con il frammento. Potrebbe essere necessario provare alcune volte perché nelle mie prove ho dovuto riaprire l'applicazione entro circa 30 ms. Questa volta può essere più lento o più veloce per diversi dispositivi di velocità.

    Il problema è che ho creato in modo esplicito il frammento (utilizzando new ) una volta e ho mantenuto un riferimento a tale istanza in modo che potessi riutilizzarlo. Una soluzione semplice a questo problema è restituire sempre una new istanza del frammento FragmentPagerAdapter.getItem(...) , come mostrato di seguito.

     public class ViewPagerAdapter extends FragmentPagerAdapter { ... @Override public Fragment getItem(int position) { switch (position) { case 0: return mMyFragment; // Error. Has the edge-case crash. case 1: return new MyFragment(); // Works. default: return new MyDefaultFragment(); } } } 

    Per il caso specifico dell'OP, utilizzare l' List<Fragment> per tenere i riferimenti è probabilmente lo stesso problema come sopra.

    ps – Il problema di root ha probabilmente qualcosa a che fare con il ciclo di vita del frammento e cercare di utilizzarlo di nuovo mentre viene distrutto.

    pps – Un altro modo per ricreare l'errore è quello di passare rapidamente tra le tabs sufficienti in modo che il frammento vuole essere distrutto per liberare una memory dalla cache, quindi tornare rapidamente ad esso. Per impostazione predefinita, FragmentPagerAdapter memorizza solo un frammento nella "sinistra" e "destra". Quindi, a seconda del limite della cache, dovrai avere alless tre tabs per ricreare l'errore in questo modo.

    ppps – Questa soluzione corregge la NullPointerException per android.app.Fragment.setUserVisibleHint(Fragment.java:997) e dovrebbe anche funzionare per android.support.v4.app.Fragment.setUserVisibleHint .

    Non credo che ci siano sufficienti informazioni per rispondere alla tua domanda. Vorrei vedere la linea esatta del codice che sta causando un puntatore nullo.

    Comunque, guardando il tuo codice, l'unico colpevole che posso immaginare può causare problemi è il getItem () where stai passando null:

      @Override public Fragment getItem(int aPosition) { if (mFragments.size() > aPosition) return mFragments.get(aPosition); return null; } 

    Dovresti essere in grado di restituire appena mFragments.get (aPosition) poiché hai già superato getCount ().

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.