Android致命错误 – 在onSaveInstanceState之后无法执行此操作

前端之家收集整理的这篇文章主要介绍了Android致命错误 – 在onSaveInstanceState之后无法执行此操作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我尝试在 Android中请求权限后执行片段事务 – 但应用程序会不断崩溃.为了避免这种情况,该代码可能如何更改?

任何帮助不胜感激

在发送电子邮件之前检查许可:

private void emailShare() {
    if (mayRequestContacts()) {
        emailShareImpl();
    }
}

检查许可证:

private boolean mayRequestContacts() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            return true;
        }

        requestPermissions(new String[]{READ_CONTACTS},REQUEST_READ_CONTACTS);

        return false;
    }

许可证检查结果:

@Override
    public void onRequestPermissionsResult(int requestCode,String[] permissions,int[] grantResults) {
        if (requestCode == REQUEST_READ_CONTACTS) {
            if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                emailShareImpl();
            }
        }
    }

如果发放授权,则启动片段交易:

private void emailShareImpl() {
        FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
        EmailReferDialog mEmailReferDialog = new EmailReferDialog();
        mEmailReferDialog.setCancelable(true);
        mEmailReferDialog.show(fragmentManager,"EMAIL_REFER_DIALOG");
    }

logcat的:

05-11 09:04:58.859 16113-16113/com.example E/AndroidRuntime: FATAL EXCEPTION: main
                                                            Process: com.example,PID: 16113
                                                            java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:,request=65536,result=-1,data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {com.example/com.example.DashboardActivity}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
                                                                at android.app.ActivityThread.deliverResults(ActivityThread.java:3743)
                                                                at android.app.ActivityThread.handleSendResult(ActivityThread.java:3786)
                                                                at android.app.ActivityThread.-wrap16(ActivityThread.java)
                                                                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1412)
                                                                at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                at android.os.Looper.loop(Looper.java:148)
                                                                at android.app.ActivityThread.main(ActivityThread.java:5466)
                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                             Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
                                                                at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1493)
                                                                at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1511)
                                                                at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:638)
                                                                at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:617)
                                                                at android.support.v4.app.DialogFragment.show(DialogFragment.java:139)
                                                                at com.example.ReferFragment.emailShareImpl(ReferFragment.java:222)
                                                                at com.example.ReferFragment.onRequestPermissionsResult(ReferFragment.java:140)
                                                                at android.support.v4.app.FragmentActivity.onRequestPermissionsResult(FragmentActivity.java:894)
                                                                at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:6582)
                                                                at android.app.Activity.dispatchActivityResult(Activity.java:6460)
                                                                at android.app.ActivityThread.deliverResults(ActivityThread.java:3739)
                                                                at android.app.ActivityThread.handleSendResult(ActivityThread.java:3786)
                                                                at android.app.ActivityThread.-wrap16(ActivityThread.java)
                                                                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1412)
                                                                at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                at android.os.Looper.loop(Looper.java:148)
                                                                at android.app.ActivityThread.main(ActivityThread.java:5466)
                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

解决方法

这是因为在活动的onResume之前调用了onRequestPermissionresult.你可以简单的解决这个问题:
private boolean mShareEmail = false;

@Override
public void onRequestPermissionsResult(int requestCode,int[] grantResults) {
    if (requestCode == REQUEST_READ_CONTACTS) {
        if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            mShareEmail = true;
        }
    }
}

@Override
public void onResume() {
    super.onResume();
    if (mShareEmail) {
        emailShareImpl();
        mShareEmail = false;
    }
}

猜你在找的Android相关文章