2016-06-24 16 views
0

私はアプリケーションの実行中のサービスを持っています。ユーザーがアプリケーションに戻ると、serviseが実行されているかどうかを確認し、それが真実なら、私はこのサービスに接続し、断片的なデータを表示しようとします。しかし、時には、私はこの間違いを得る:接続が行われた場合にservise致命的な例外:java.lang.IllegalStateException:アクティビティが破棄されました

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); 
} 

に接続するための

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) 

試み - フラグメントを作成し、データに

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

コールフラグメント

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

行番号「712」はどちらですか? –

+1

@ρяσѕρєяK例外に基づいて、私はそれが最後のものだと推測しています: 'transaction.commitAllowingStateLoss();' – REG1

+0

はい。 commitAllowingStateLoss()の後に例外が表示される – Devnock

答えて

2

問題はサービスへの接続は非同期で行われ、アクティビティが破棄された後にonServiceConnected(ComponentName, IBinder)が呼び出される可能性があります。 (あなたは、Androidの古いバージョンをサポートする場合、および/またはisFinishing()

この問題を解決するためには、あなたの活動の状態を確認し、それが破壊されていた後の相互作用を防ぐためにActivity.isDestroyed()機能を使用することができます。

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

ありがとう、友人。私はそれについて考えましたが、私はこの断片を示す必要があります。この場合、どうやってやるのか分かりませんか?私は知らない、Activitiや何か他のものを作り直すことができるだろうか? – Devnock

+0

ユースケースによって異なります。ユーザーが放置したためにアクティビティが破棄された場合(たとえば、戻るボタンを押すなど)、何も表示しないことになります。アクティビティがまだ関連している場合は、 'startActivity()'をもう一度呼び出すことができます。 –

+0

hm。そして、サービスからいくつかのデータをインテントで送信します。すばらしいです!私はこれを試して – Devnock

関連する問題