2

안녕하세요. 도움을 주셔서 감사합니다.회전 중 "활동을 파괴 할 수 없습니다 ... onSaveInstanceState 이후에이 작업을 수행 할 수 없습니다"

로테이션 처리를위한 코드 구성의 시작 부분에 불과합니다. onDestroy()를 구현했지만 아직 onSaveInstanceState() 또는 onRetainNonConfigurationInstance()를 구현하지 않은 이유는 파괴 된 경우 문제가 발생하지 않을 것으로 생각했기 때문입니다. 회전 후 다시 만들고 무엇을 구해야 하는가?

내 응용 프로그램에서 AsyncTask를 실행하는 서비스와 사용자가 단추를 누르면 교환되는 3 개의 조각을 사용합니다.

조각을 관리하기 위해 호환성 라이브러리를 사용합니다.

내가 만난 오류가 조각과 관련되어 있다고 의심됩니다.

구체적으로, 내가 조각을 선호 파괴 및 회전에 다시, 오히려 그 수를 유지

(이것이 내 코드를 간단하게 것이 나의 희망 ...이기 때문에) 에뮬레이터를 회전시켜 제목에 오류가 발생합니다.

이 주요 활동의 코드는 다음과 같습니다

public class Quotes extends FragmentActivity { 

    private String url2; 
    //public String responseBody; 
    public static ArrayList<Stock> lt; 
    public static ArrayList<Stock> best; 
    public static ArrayList<Stock> worst; 
    public static ArrayList<Stock> fav;// =new ArrayList<Stock>(); 
    public static LocalService mService; 
    boolean mBound;// = false; 
    public MyAdapter myAdap; 
    public Messenger messenger; 
    public Messenger messenger2; 
    public Grab g; 
    public static Handler handler; 
    public static Handler handler2; 
    public Intent intent; 
    public ListView lv; 
    public dettagliofragment fragment; 
    public listafragment fragmentlista ; 
    public static boolean tablet;//=true; 
    public static WorstBest worstbest; 
    public static favouritesFragment fragmentfavourites; 
    public static FragmentActivity fragmentActivity; 
    public static int stack; 
    public static ArrayList<Integer> stackArray; // stackArray =new ArrayList<Integer>(); 

    @Override 
     public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     stackArray =new ArrayList<Integer>(); 
     fav =new ArrayList<Stock>(); 
     tablet=true; 
     mBound = false; 
     fragmentActivity = this; 
     setContentView(R.layout.splash); 
     url2=getString(R.string.url2); 
     g = new Grab(url2); 
     String s = g.vai(); 
     //Log.e("", s); 
     Log.e("", "passo oltre l'invocazione al grab"); 
     lt = new MyParser(s).parseResp(); 
     fragmentlista = new listafragment(); 
     fragmentfavourites= new favouritesFragment() ; 
     worstbest = new WorstBest(); 
     /////////////////primo message handler 
     handler=new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 
      Message mess=msg; 
      Log.e("","MESSAGGIO RICEVUTO"); 
      lt = mService.ritira(); 
      Log.e("what?", Integer.toString(mess.what)); 
      if(mess.what==0){ 

       worst=mService.ritiraWorst(); 
       best=mService.ritiraBest(); 
       fav=mService.ritiraFav(); 
       setContentView(R.layout.main); 
       View view1=(View)findViewById(R.id.view1); 
       View view2=(View)findViewById(R.id.view2); 
       if(view2==null) {tablet=false;}; 
       FragmentManager fragmentManager = getSupportFragmentManager(); 
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();  
       fragmentTransaction.add(R.id.view1, fragmentlista); 
       if(tablet){fragmentTransaction.add(R.id.view2, worstbest);} 
       fragmentTransaction.commit(); 
       g.fermaGrab(); 
       Log.e("", "fermograb"); 
        }; 

      } 
     }; 
     messenger = new Messenger(handler); 

     intent = new Intent(this, LocalService.class); 
     intent.putExtra("messenger", messenger);  

     /////////////////secondo message handler 
     handler2=new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 

      Message mess=msg; 
      Log.e("","SECONDO MESSAGGIO RICEVUTO"); 
      lt = mService.ritira(); 
      worst=mService.ritiraWorst(); 
      best=mService.ritiraBest(); 
      fav=mService.ritiraFav(); 
      if(lt==null){Log.e("","lt è nullo");}; 
      if(fragmentlista==null){Log.e("","fragmentlista è nullo");}; 

      fragmentlista.prendiLista(lt); 
      worstbest.prendiListaWorst(worst); 
      worstbest.prendiListaBest(best); 
      if(fav.size()>0)fragmentfavourites.prendiLista(fav); 
      }; 
      }; 
     messenger2 = new Messenger(handler2); 
     intent.putExtra("messenger2", messenger2); 

     bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 
    } 

    public static void layoutSchermo(int conf){ 

    if(conf==1){  
     FragmentManager fragmentManager = fragmentActivity.getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); 
     if(!tablet){fragmentTransaction.replace(R.id.view1, fragmentfavourites);} 
     if(tablet){fragmentTransaction.replace(R.id.view2, fragmentfavourites);} 
     fragmentTransaction.addToBackStack(null); 
     stack=fragmentTransaction.commit(); 
     stackArray.add(stack); 
     Log.e("","stack = "+ Integer.toString(stack)); 
     } 
    if(conf==2){  
     FragmentManager fragmentManager = fragmentActivity.getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); 
     if(!tablet){fragmentTransaction.replace(R.id.view1, worstbest);} 
     if(tablet){fragmentTransaction.replace(R.id.view2, worstbest);} 
     fragmentTransaction.addToBackStack(null); 
     stack= fragmentTransaction.commit(); 
     stackArray.add(stack); 
     Log.e("","stack = "+ Integer.toString(stack)); 
     } 

    } 

    @Override 
    public void onBackPressed(){ 
     FragmentManager fragmentManager = fragmentActivity.getSupportFragmentManager(); 
     if(stackArray.size()>0) 
      {for(int i=1;i<stackArray.size();i++){ 
       fragmentManager.popBackStackImmediate(stackArray.get(i),  FragmentManager.POP_BACK_STACK_INCLUSIVE);} 
      } 

     super.onBackPressed(); 
    } 


    protected void onStop() { 
      Log.e("onstop","passo per onstop"); 

      mService.stop(); 
      g.fermaGrab(); 
      super.onStop();  
      } 
    protected void onPause() { 
      Log.e("onpause","passo per onpause"); 
      mService.stop(); 
      g.fermaGrab(); 
      super.onPause();  
     } 


    protected void onDestroy() { 
     Log.e("ondestroy","passo per ondestroy"); 
     mService.stop(); 
     g.fermaGrab(); 
     //handler.removeMessages(333); 
     stopService(intent); 
     //g=null; 
     FragmentManager fragmentManager = fragmentActivity.getSupportFragmentManager(); 
     if(stackArray.size()>0) 
      {for(int i=1;i<stackArray.size();i++){ 
       fragmentManager.popBackStackImmediate(stackArray.get(i),  FragmentManager.POP_BACK_STACK_INCLUSIVE);} 
      } 

     super.onDestroy(); 

     } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { } 


    public static ArrayList<Stock> dammi(){ 
     return lt; 
    } 

    public void inizia() 
    { 
     Log.e("","il serlizio è bound ? "+ mBound); 
     mService.prendi(lt); 
     mService.getNumber(); 


    }   

     private ServiceConnection mConnection = new ServiceConnection() { 

      //@Override 
      public void onServiceConnected(ComponentName className, 
        IBinder service) { 
       Log.e("", "sono in ServiceConnection"); 
       // We've bound to LocalService, cast the IBinder and get LocalService instance 
       LocalBinder binder = (LocalBinder) service; 
       mService = binder.getService(); 
       mBound = true; 
       //inizia(); 
       mService.prendi(lt); 
       mService.getNumber(); 

      } 

      //@Override 
      public void onServiceDisconnected(ComponentName arg0) { 
       mBound = false; 
       mService = null; 
      } 
     }; 

신은 내 로그 캣입니다 :

01-06 12:20:27.869: E/AndroidRuntime(2165): FATAL EXCEPTION: main 
01-06 12:20:27.869: E/AndroidRuntime(2165): java.lang.RuntimeException: Unable to destroy activity {com.example.quotes/com.example.quotes.Quotes}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3273) 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3291) 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3489) 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at android.app.ActivityThread.access$700(ActivityThread.java:130) 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1201) 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at android.os.Looper.loop(Looper.java:137) 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at java.lang.reflect.Method.invoke(Method.java:511) 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at dalvik.system.NativeStart.main(Native Method) 
01-06 12:20:27.869: E/AndroidRuntime(2165): Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1314) 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:480) 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at com.example.quotes.Quotes.onDestroy(Quotes.java:201) 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at android.app.Activity.performDestroy(Activity.java:5172) 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1109) 
01-06 12:20:27.869: E/AndroidRuntime(2165):  at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3260) 
01-06 12:20:27.869: E/AndroidRuntime(2165):  ... 12 more 

어떤 도움 주셔서 감사합니다!

+1

당신의 onConfigurationChanged() 나는 그 다음의 onConfigurationChanged 방법에서 그 코드를 작성들의 OnDestroy에서 조각을 다시 팝업을 alllowing되지 않은 경우 말을 의미 –

+1

에 열세 코드를 전환 할 수 있습니다, 이것은 내가 의지 방향 변경 –

+0

@ChangdeoJadhav에 호출됩니다 지금 당장 해봐. 덕분에 –

답변

1

정보 주셔서 감사합니다. 한편, 나는이 문제를 해결했다.

로테이션으로 인해 Activty가 파괴되었을 때 언 바운드해야하는 서비스가 문제의 원인이었습니다.

내가 알 수있는 한, 활동이 파괴되면 단편은 파괴되지 않습니다. 그러나, 나는 이것에 대한 의견을 주셔서 감사합니다.

따라서 소멸 후 Activty가 다시 생성 될 때 onCreate() 메서드에서 Fragments를 다시 초기화했습니다. 이로 인해 응용 프로그램에 문제가 발생하지 않습니다.

protected void onDestroy() { 
    mService.stop(); 
    stopService(new Intent(this, LocalService.class)); 
    unbindService(mConnection); 
    g.fermaGrab(); 
    stopService(intent); 
    Log.e("ondestroy","passostopService(intent)"); 
    super.onDestroy();  
} 
0

이 질문에 대한 다른 답변이있는 WeakReferences, 메모리 누수 및 onResumeFragments의 야생 거위 사냥에 저를지도해서 ... 당신은 단순히 대화 상자를 팝업 애쓰는 onFocusChangeListener을함으로써이 오류를 얻을 수 있습니다 컨트롤이 포커스를 잃을 때 상자. 오류는 ActivityThread.handleRelaunchActivity에서 발생하므로 알아 내기가 조금 어렵습니다.

관련 문제