0

왜 이런 일이 발생하는지 알고 있습니다.runOnUiThread가 화면을 회전시킬 때 응용 프로그램을 죽입니다.

화면을 회전하면 활동이 파괴되고 다시 생성되며 runOnUiThread() 메소드가 더 이상 유효하지 않은 이전 (파괴 된) 활동을 참조하므로 안드로이드가 runtimeexception을 던졌습니다.

@ContentView(R.layout.activity_start) 
public class StartActivity extends RoboSherlockFragmentActivity { 

    @Inject 
    private EventManager eventManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if (savedInstanceState == null) { 
      Fragment newFragment = new WelcomeFragment(); 
      FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
      ft.replace(R.id.fragment_container, newFragment).commit(); 

      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         Thread.sleep(2000); 
         //Do some short initialization here like read shared prefs 
         //and then decide for example whether to login or skip the login 

         //If the rotation happens while sleeping the app will certainly crash 
         runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           addFragmentToStack(); 
          } 
         }); 
        } catch (Exception e) { 
         // TODO: handle exception 
        } 
       } 
      }).start(); 
     } 
    } 

    void addFragmentToStack() { 
     Fragment newFragment = new LoginOrRegisterFragment(); 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.replace(R.id.fragment_container, newFragment); 
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
     ft.commit(); 
    } 
} 

내가 같은 몇 가지 쉬운 일에 대한 asynctask을 사용해야합니까 :

내가이 코드가이 문제를 설명하기 위해? 그렇다면 어떻게 회전을 처리합니까? 콜백 참조가 잘못 되었기 때문입니다. 대신 스레드 코드의

답변

1
try this 

new Handler(getMainLooper()).postDelayed(new Runnable(){ 

      if(!isFinishing()){ 
        addFragmentToStack(); 
       } 
      },200); 

isFinishing()이 활동이

을 destoryed되는 과정에있을 때라고 당신이하려는 모든 작업이 후에 실행 할 것 같다 200ms가 경과했습니다. 새로운 스레드를 열 필요가없는 경우 처리기는 코드를 실행합니다. 메인 루퍼 Handler(getMainLooper())을 호출하는 처리기를 만들고 주 스레드에서 코드가 실행되도록하려면 두 번째로 수행하십시오. 이 처리기가 주 스레드에서 해당 작업을 실행하게하십시오.

0

AsyncTask는 동일한 충돌을 생성합니다. onPause()을 간단히 무시하고 스레드가 활동을 파괴하려고한다는 것을 알 수있는 방법을 찾으십시오. 변수의 null 값을 확인하는 것과 같습니다.

또는보기 변경없이 콜백 단편을 사용하여 구성 변경 사항을 추적 할 수 있습니다. 이 article은 시작하는 가장 좋은 방법입니다. 이 방법은 매우 깨끗한 접근 방법이므로 선호합니다.

0

나는 모든 OnCreate에서 Activity에 대한 참조를 저장하는 retain fragment를 사용하여 비슷한 문제를 해결했습니다. retainFragment.activity = this; . runOnUiThread에서 보존 된 참조가 현재 Activity인지 확인합니다. if (retainFragment.activity == MainActivity.is) ..

관련 문제