“失败交付成果” - onActivityForResult(“Failure Deliveri

2019-09-01 07:26发布

我有一个LoginActivity (用户登录)。 它基本上是自己的Activity是主题就像一个对话框(看上去好像一个对话框)。 这似乎在SherlockFragmentActivity 。 我要的是:如果有一个成功登录,应该有两个FragmentTransaction的更新视图。 下面是代码:

LoginActivity ,如果登录成功,

setResult(1, new Intent());

SherlockFragmentActivity

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == 1) {
        LoggedStatus = PrefActivity.getUserLoggedInStatus(this);
        FragmentTransaction t = MainFragmentActivity.this.getSupportFragmentManager().beginTransaction();
        SherlockListFragment mFrag = new MasterFragment();
        t.replace(R.id.menu_frame, mFrag);
        t.commit();

        // Set up Main Screen
        FragmentTransaction t2 = MainFragmentActivity.this.getSupportFragmentManager().beginTransaction();
        SherlockListFragment mainFrag = new FeaturedFragment();
        t2.replace(R.id.main_frag, mainFrag);
        t2.commit();
    }
}

它崩溃的第一次提交,这个logcat的:

E/AndroidRuntime(32072): Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
E/AndroidRuntime(32072):    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299)
E/AndroidRuntime(32072):    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310)
E/AndroidRuntime(32072):    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541)
E/AndroidRuntime(32072):    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525)
E/AndroidRuntime(32072):    at com.kickinglettuce.rate_this.MainFragmentActivity.onActivityResult(MainFragmentActivity.java:243)
E/AndroidRuntime(32072):    at android.app.Activity.dispatchActivityResult(Activity.java:5293)
E/AndroidRuntime(32072):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3315)

Answer 1:

首先,你应该读我的博客文章以了解更多信息(它谈论为什么这个发生异常时,你可以做些什么来防止它)。

调用commitAllowingStateLoss()更是一个黑客不是修复。 国家的损失是坏的,应该不惜一切代价避免。 在那个时候onActivityResult()被调用时,活动/片段的状态可能还没有得到恢复,因此在这个时候,发生的任何交易都将丢失作为一个结果。 这是必须解决的一个非常重要的bug! (请注意,错误只发生在你的Activity是由系统......这,这取决于设备有多少内存,有时会出现罕见的已经被杀害后回来了......所以这类型的错误是不是一件很容易在测试赶上)。

尝试移动您的交易进入onPostResume()代替(注意onPostResume()后,总是叫onResume()onResume()后,总是叫onActivityResult()

private boolean mReturningWithResult = false;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    mReturningWithResult = true;
}

@Override
protected void onPostResume() {
    super.onPostResume();
    if (mReturningWithResult) {
        // Commit your transactions here.
    }
    // Reset the boolean flag back to false for next time.
    mReturningWithResult = false;
}

这似乎有点不可思议,但在做这样的事情是必要的,以确保您FragmentTransaction s的始终致力于Activity的状态已经恢复到原来的状态( onPostResume()是保证后,被称为Activity “ S状态已经恢复)。



Answer 2:

这类似于@Alex洛克伍德答案,但使用Runnable

private Runnable mOnActivityResultTask;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    mOnActivityResultTask = new Runnable() {
        @Override
        public void run() {
            // Your code here
        }
    }
}

@Override
protected void onPostResume() {
    super.onPostResume();
    if (mOnActivityResultTask != null) {
        mOnActivityResultTask.run();
        mOnActivityResultTask = null;
    }
}

如果你运行Android 3.0及以上lambda表达式 ,使用:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    mOnActivityResultTask = () -> {
        // Your code here
    }
}


Answer 3:

您可以使用ft.commitAllowingStateLoss()来解决这个问题。

原因:你的ft.commit()方法切换后onSaveInstanceState



Answer 4:

您logcat的清清楚楚地写着:“后的onSaveInstanceState无法执行此操作” -你的Activity已经在这一点上死了,也不会返回任何结果。

刚刚转会:

Intent in = new Intent();
setResult(1, in);

在你的地方Activity的地方还活着,一切都会好起来的。 并且不要忘记finish()Activity ,提供的结果。



Answer 5:

在我的情况我遇到因为以下的原因相同的问题

public void onBackPressed() {
    super.onBackPressed();
    setIntents();

}


private void setIntents(){
    Intent searchConstaints=new Intent();
    searchConstaints.putExtra("min",20);
    searchConstaints.putExtra("max",80);
    setResult(101,searchConstaints);
    finish();
}

通过重新排列内onBackPressed的函数调用解决()

public void onBackPressed() {

    setIntents();
    super.onBackPressed();

}


文章来源: “Failure Delivering Result ” - onActivityForResult