Java 调用onDestroy后在AsyncTask.onPostExecute中处理碎片事务的最佳方法
在我的应用程序中,我总是需要在应用程序第一次打开时执行一些操作。当用户打开它时,应用程序显示一个带有进度条的对话框,同时在后台执行Java 调用onDestroy后在AsyncTask.onPostExecute中处理碎片事务的最佳方法,java,android,android-fragments,android-asynctask,android-activity,Java,Android,Android Fragments,Android Asynctask,Android Activity,在我的应用程序中,我总是需要在应用程序第一次打开时执行一些操作。当用户打开它时,应用程序显示一个带有进度条的对话框,同时在后台执行AsyncTask,然后(在onPostExecute())我需要提交一个片段 因此,在我的主要活动的onCreate()方法中,我有: public class InitialActivity extends SherlockFragmentActivity{ @Override protected void onCreate(Bundle savedIn
AsyncTask
,然后(在onPostExecute()
)我需要提交一个片段
因此,在我的主要活动的onCreate()
方法中,我有:
public class InitialActivity extends SherlockFragmentActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_initial);
if(savedInstanceState == null) //Executes just at the firstTime
{
//ApplicationStarter -> It manages all execution to start my app, executes asynctask, shows dialogs..
ApplicationStarter starter = new ApplicationStarter(this) {
@Override
public void afterFinish() {
//It Executes at onPostExecute when doInBackground() finishes
ItensFragment itensfrag = new ItensFragment();
frag.setTargetFragment(itensfrag , 0);
android.support.v4.app.FragmentTransaction ft = getSupportFragmentManager()
.beginTransaction();
ft.replace(R.id.simple_fragment, itensfrag);
ft.commitAllowingStateLoss();
}
};
starter.start();
}
}
}
所以,一切都会正常,但是如果用户旋转设备或调用ondstroy()
方法,应用程序就会崩溃。启动以下异常:
java.lang.IllegalStateException: Activity has been destroyed
在ft.commitAllowingStateLoss()代码>
我四处搜索,发现在异步回调方法中执行片段
转换并不是一个好的实践,就像我正在尝试的那样。
还有,也许我可以适应我的情况。但在此之前,我想知道是否有人对我的工作有更好的方法或建议。
提前谢谢。按照@Raghunandan的建议,我照做了,一切都很顺利。最大的区别是,现在我在片段的onCreate
上调用我的应用程序启动程序,该片段设置为setRetainInstance(true)
。InitialActivity有一个ItensFragment
实例。我的InitialActivity
的onCreate()
中的代码是:
public class InitialActivity extends SherlockFragmentActivity {
private ItensFragment itensfrag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_inicial);
FragmentManager fm = getSupportFragmentManager();
itensfrag= (ItensFragment) fm.findFragmentByTag("itensfrag");
if (savedInstanceState == null) {
if (itensfrag== null) {
itensfrag= new ItensFragment();
fm.beginTransaction().replace(R.id.simple_fragment, itensfrag, "itensfrag").commit();
}
}
}
}
当方向改变时发生。您的活动被销毁并重新创建。Asynctask顾名思义就是Asynchronous如果有帮助的话,你可以查看这个博客。