android - 我可以开始多少级 Activity/fragment ?

标签 android android-fragments crash fragment android-fragmentactivity

我从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

最佳答案

不,没有这样的明确限制。您遇到的问题是,尽管其中一个 Activity 之前已经关闭,但当其中一个 Activity 回到最前面时(似乎在MyActivity.onResume()中),数据库游标已被重用。

关于android - 我可以开始多少级 Activity/fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30318205/

相关文章:

java - 动画监听器不响应 Animatorset

android - WebView 和 Button 的 LinearLayout

java - Android Studio,应用程序将无法运行而不崩溃

android - 如何等待两个游标加载器返回数据,然后再根据返回数据启动第三个?

android - 在另一个 fragment 之上显示 fragment

android - 发现任务 ':app:generateSafeArgsDebug'(类型 'ArgumentsGenerationTask')的配置存在一些问题。将 gradle 升级到 7.0 后

android - ArrayAdapter<String> 中的 getPosition(item) 给出 NullPointerException

c++ - wsregex::compile 在处理正则表达式字符串时崩溃(内存泄漏)?

cocoa - 如何将崩溃报告的电子邮件地址重定向到我的电子邮件(对于我的 cocoa 应用程序)

Android 1.6 模拟器崩溃