2

嗨,谢谢你的任何帮助。我已经实现onDestroy(),但还没有任何onSaveInstanceState()或onRetainNonConfigurationInstance(),因为我搞清楚什么不会导致问题,如果销毁,并且还没有onRetainNonConfigurationInstance()或onRetainNonConfigurationInstance轮换后重新创建,需要保存的内容。在旋转我得到“无法销毁活动...在onSaveInstanceState后无法执行此操作”

在我的应用程序中,我使用一个运行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; 
      } 
     }; 

祂是我的logcat:

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() –

+1

我的意思是说,如果它不alllowing你弹回片段中的OnDestroy然后写在onConfigurationChanged方法的代码,这将是呼吁方向更改 –

+0

@ChangdeoJadhav我会现在就试试。谢谢 –

回答

1

感谢您的信息。同时,我解决了这个问题。

导致问题的原因是当Activity由于旋转而被销毁时需要解除绑定的服务。

据我所知,当活动被破坏时碎片不会被销毁。不过,我希望对此有任何评论。

所以,我重新初始化onCreate()方法的碎片时,在销毁后再次创建活动时,这不会给应用程序造成麻烦。

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,所以有点难以弄清楚。

相关问题