【发布时间】:2015-05-19 06:27:06
【问题描述】:
当我从 FragmentActivity/Fragment 组合的第 3 级启动时,我在启动从图库中选择图像的 Activity 时遇到问题。如果我从第一级或第二级开始,它就可以工作。 在应用程序中,最多有 5 个级别的 FramentActivity/Fragment 组合运行没有问题,但我没有启动 Activity 来从中挑选图像。
我可以启动的 FramentActivity/Fragment 组合是否有最高级别?还是我做错了什么?
FragmentActivity 像这样启动 Fragment:
public class MyActivity extends FragmentActivity
{
private MyFragment _fragment;
...
@Override
public void onCreate( Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
setContentView( R.layout.simple_fragment_container_activity );
// create the fragment to show
FragmentManager fm = getSupportFragmentManager();
_fragment = (MyFragment)fm.findFragmentById( R.id.fragment_container );
// If the Fragment is non-null, then it is currently being retained across a configuration change.
if( _fragment == null )
{
_fragment = new MyFragment();
// start the new fragment
FragmentTransaction ft = fm.beginTransaction();
ft.add( R.id.fragment_container, _fragment );
ft.commit();
}
}
片段代码为:
@Override
public void onCreate( Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
// retain this fragment across configuration changes
setRetainInstance( true );
}
@Override
public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState )
{
View v = inflater.inflate( R.layout.my_fragment, container, false );
...
return v;
}
在按钮的 OnClickListener 中,我像这样启动图像选择器:
Intent intent = new Intent( Intent.ACTION_GET_CONTENT );
intent.setType( "image/*" );
startActivityForResult( intent, 20 );
只要我关闭图像选择器(无论是否选择图像),我的应用都会在恢复之前崩溃。 onActivityResult 方法有时被完全调用,有时被部分调用。它暂时只记录图像路径:
if( resultCode != Activity.RESULT_OK ) return;
if( requestCode == 20 )
{
Uri selectedImage = intent.getData();
Log.w( null, "image picked: " + selectedImage.toString() );
}
崩溃将其写入 LogCat 并且在我的代码 IMO 中不会发生:
05-19 08:18:19.210: D/AndroidRuntime(24592): Shutting down VM
05-19 08:18:19.210: W/dalvikvm(24592): threadid=1: thread exiting with uncaught exception (group=0x41826da0)
05-19 08:18:19.220: E/AndroidRuntime(24592): FATAL EXCEPTION: main
05-19 08:18:19.220: E/AndroidRuntime(24592): Process: ch.infero.testapp, PID: 24592
05-19 08:18:19.220: E/AndroidRuntime(24592): java.lang.RuntimeException: Unable to resume activity {ch.infero.testapp/ch.infero.testapp.settings.MyActivity}: android.database.StaleDataException: Attempted to access a cursor after it has been closed.
05-19 08:18:19.220: E/AndroidRuntime(24592): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2946)
05-19 08:18:19.220: E/AndroidRuntime(24592): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2975)
05-19 08:18:19.220: E/AndroidRuntime(24592): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1307)
05-19 08:18:19.220: E/AndroidRuntime(24592): at android.os.Handler.dispatchMessage(Handler.java:102)
05-19 08:18:19.220: E/AndroidRuntime(24592): at android.os.Looper.loop(Looper.java:157)
05-19 08:18:19.220: E/AndroidRuntime(24592): at android.app.ActivityThread.main(ActivityThread.java:5356)
05-19 08:18:19.220: E/AndroidRuntime(24592): at java.lang.reflect.Method.invokeNative(Native Method)
05-19 08:18:19.220: E/AndroidRuntime(24592): at java.lang.reflect.Method.invoke(Method.java:515)
05-19 08:18:19.220: E/AndroidRuntime(24592): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
05-19 08:18:19.220: E/AndroidRuntime(24592): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
05-19 08:18:19.220: E/AndroidRuntime(24592): at dalvik.system.NativeStart.main(Native Method)
05-19 08:18:19.220: E/AndroidRuntime(24592): Caused by: android.database.StaleDataException: Attempted to access a cursor after it has been closed.
05-19 08:18:19.220: E/AndroidRuntime(24592): at android.database.BulkCursorToCursorAdaptor.throwIfCursorIsClosed(BulkCursorToCursorAdaptor.java:64)
05-19 08:18:19.220: E/AndroidRuntime(24592): at android.database.BulkCursorToCursorAdaptor.requery(BulkCursorToCursorAdaptor.java:133)
05-19 08:18:19.220: E/AndroidRuntime(24592): at android.database.CursorWrapper.requery(CursorWrapper.java:186)
05-19 08:18:19.220: E/AndroidRuntime(24592): at android.app.Activity.performRestart(Activity.java:5471)
05-19 08:18:19.220: E/AndroidRuntime(24592): at android.app.Activity.performResume(Activity.java:5497)
05-19 08:18:19.220: E/AndroidRuntime(24592): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2936)
05-19 08:18:19.220: E/AndroidRuntime(24592): ... 10 more
【问题讨论】:
-
没有最大值。但是错误在堆栈跟踪中得到了完美的解释:
android.database.StaleDataException: Attempted to access a cursor after it has been closed.
标签: android android-fragments crash fragment android-fragmentactivity