2016-06-24 7 views
0

Ich habe einen laufenden Dienst der Anwendung. Wenn der Benutzer zur App zurückkehrt, überprüfe ich, ob der Dienst läuft und wenn es wahr ist, versuche ich, mich mit diesem Dienst zu verbinden und ein Fragment mit einigen Daten anzuzeigen. Aber manchmal bekomme ich diesen Fehler:Schwerwiegende Ausnahme: java.lang.IllegalStateException: Aktivität wurde zerstört

Fatal Exception: java.lang.IllegalStateException: Activity has been destroyed 
     at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1433) 
     at android.app.BackStackRecord.commitInternal(BackStackRecord.java:687) 
     at android.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:667) 
     at com.fjuul.fjuul.MainActivity.showGPSFragment(MainActivity.java:712) 

Versuch mit servise zu verbinden

private void connectService() { 
    registerFitnessReceiver(); 
    sConn = new ServiceConnection() { 
     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) { 
      if (service != null) { 
       callGPSFragment(status, mapWaySelections, activityType); 
      } 
     } 

     @Override 
     public void onServiceDisconnected(ComponentName name) { 

     } 
    }; 
    Intent requestIntent = new Intent(MainActivity.this, FitnessRecordingService.class); 
    requestIntent.setAction(FitnessRecordingService.GET_FITNESS_RECORD_ACTION); 
    bindService(requestIntent, sConn, 0); 
} 

wenn Anschluss erfolgt - erstellen Fragment und Fülldaten

private void callGPSFragment() { 
     ... 
     GPSServicePresenter gpsServicePresenter = new GPSServicePresenter(); 
     showGPSFragment(gpsServicePresenter); 

Anruf Fragment

public void showGPSFragment(GPSServicePresenter gpsServicePresenter) { 
    FragmentManager fragmentManager = getFragmentManager(); 
    FragmentTransaction transaction = fragmentManager.beginTransaction(); 
    transaction.replace(R.id.body_fragent, gpsServicePresenter); 
    Fragment oldFragment = fragmentManager.findFragmentByTag(SplashFragment.tag()); 
    if (oldFragment != null) { 
     transaction.remove(oldFragment); 
    } 
    transaction.commitAllowingStateLoss(); 
} 
+0

Welches ist die Zeilennummer '712'? –

+1

@ ρяσѕρєяK Basierend auf der Ausnahme, ich vermute es ist die letzte: 'transaction.commitAllowingStateLoss();' – REG1

+0

Ja. Es ist wahr. Ausnahme zeigt nach commitAllowingStateLoss() – Devnock

Antwort

2

Das Problem ist dass Verbindungen zu Diensten asynchron stattfinden und die Wahrscheinlichkeit besteht, dass onServiceConnected(ComponentName, IBinder) aufgerufen wird, nachdem Ihre Aktivität zerstört wurde.

Um dies zu beheben, können Sie die Activity.isDestroyed() Funktion (und/oder isFinishing() wenn Sie ältere Versionen von Android unterstützen wollen) den Zustand Ihrer Aktivität zu überprüfen und Wechselwirkungen zu verhindern, nachdem es zerstört worden ist:

@Override 
public void onServiceConnected(ComponentName name, IBinder service) { 
    if (service != null && !isDestroyed()) { 
     callGPSFragment(status, mapWaySelections, activityType); 
    } 
} 
+0

Vielen Dank, Freund. Ich habe darüber nachgedacht, aber ich muss dieses Fragment zeigen. Keine Ahnung, wie es in diesem Fall geht? Ich weiß nicht, kann die Activiti oder etwas anderes neu erstellt werden? – Devnock

+0

Hängt vom Anwendungsfall ab. Wenn die Aktivität zerstört wurde, weil der Benutzer sie verlassen hat (z. B. durch Drücken der Zurück-Schaltfläche), möchten Sie wahrscheinlich nichts anzeigen. Wenn die Aktivität immer noch relevant ist, sollten Sie 'startActivity()' erneut aufrufen. –

+0

hm. Und senden Sie einige Daten aus dem Dienst mit Absicht. Groß! Ich versuche das – Devnock