RxPermissions icon indicating copy to clipboard operation
RxPermissions copied to clipboard

W/System.err: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

Open pradipawasthi opened this issue 5 years ago • 43 comments

09-15 13:31:03.381 15829-15829/com.doubtnutapp W/System.err: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at androidx.fragment.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:2091) at androidx.fragment.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:2229) at androidx.fragment.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2249) at androidx.fragment.app.BackStackRecord.commitNow(BackStackRecord.java:648) 09-15 13:31:03.382 15829-15829/com.doubtnutapp W/System.err: at com.tbruyelle.rxpermissions2.RxPermissions.getRxPermissionsFragment(RxPermissions.java:77) at com.tbruyelle.rxpermissions2.RxPermissions.access$000(RxPermissions.java:36) at com.tbruyelle.rxpermissions2.RxPermissions$1.get(RxPermissions.java:61) at com.tbruyelle.rxpermissions2.RxPermissions$1.get(RxPermissions.java:54) at com.tbruyelle.rxpermissions2.RxPermissions.pending(RxPermissions.java:211) at com.tbruyelle.rxpermissions2.RxPermissions.request(RxPermissions.java:200) at com.tbruyelle.rxpermissions2.RxPermissions.access$100(RxPermissions.java:36) at com.tbruyelle.rxpermissions2.RxPermissions$2.apply(RxPermissions.java:102) at io.reactivex.Observable.compose(Observable.java:6283) at com.tbruyelle.rxpermissions2.RxPermissions.request(RxPermissions.java:176) at com.doubtnutapp.ui.splash.SplashActivity.requestPermission(SplashActivity.kt:143) at com.doubtnutapp.ui.splash.SplashActivity$onStart$1.onInitFinished(SplashActivity.kt:131) at io.branch.referral.ServerRequestRegisterInstall.onRequestSucceeded(ServerRequestRegisterInstall.java:106) at io.branch.referral.Branch$BranchPostTask.onPostExecute(Branch.java:2937) at io.branch.referral.Branch$BranchPostTask.onPostExecute(Branch.java:2799) at android.os.AsyncTask.finish(AsyncTask.java:660) at android.os.AsyncTask.-wrap1(AsyncTask.java) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:677) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:165) at android.app.ActivityThread.main(ActivityThread.java:6365) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:883) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)

pradipawasthi avatar Sep 15 '18 08:09 pradipawasthi

A lot of my app users have same problem and I don't know what to do...

Edwhis avatar Sep 15 '18 14:09 Edwhis

Maybe it's better to call commitAllowingStateLoss() than commitNow() .

lovejjfg avatar Sep 17 '18 08:09 lovejjfg

问题解决了吗?我也遇到这个问题了

MrWangChong avatar Sep 18 '18 09:09 MrWangChong

I still use version 0.9.5 ,in this version, there is no this issue.

lovejjfg avatar Sep 18 '18 12:09 lovejjfg

Thanks, I let't delay 200 millisecond, then no problem, if has problem I'm attempt your method!

MrWangChong avatar Sep 18 '18 12:09 MrWangChong

我fork了一份解决了这个问题,比楼上的延时处理更好 https://github.com/YougaKing/RxPermissions.git

YougaKing avatar Sep 20 '18 10:09 YougaKing

好像没有0.9.5 这个版本的吧

akingyin1987 avatar Oct 08 '18 02:10 akingyin1987

我fork了一份解决了这个问题,比楼上的延时处理更好 https://github.com/YougaKing/RxPermissions.git

你是处理的哪里

akingyin1987 avatar Oct 15 '18 08:10 akingyin1987

我fork了一份解决了这个问题,比楼上的延时处理更好 https://github.com/YougaKing/RxPermissions.git

你是处理的哪里

fragment 创建时机问题,java.lang.IllegalStateException

YougaKing avatar Oct 15 '18 08:10 YougaKing

Same problem here

hijamoya avatar Oct 17 '18 13:10 hijamoya

i have this problem too

dergod avatar Nov 27 '18 09:11 dergod

i have problem too

DeevD avatar Nov 28 '18 03:11 DeevD

A detailed description of the problem and what you have to do is here. https://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html

In general, the best way to avoid the exception in these cases is to simply avoid committing transactions in asynchronous callback methods all together. Google engineers seem to agree with this belief as well. According to this post on the Android Developers group, the Android team considers the major shifts in UI that can result from committing FragmentTransactions from within asynchronous callback methods to be bad for the user experience.

we have to do:

  • either make a blocking call: blockingSubscribe()
  • either use: commitAllowingStateLoss()

tim4dev avatar Nov 28 '18 12:11 tim4dev

@tim4dev disagree with your suggestions (but not with article). According to provided link

Use commitAllowingStateLoss() only as a last resort.

Good way of handling such situations will be dispose subscribtions to any org.reactivestreams.Publisher (e.g. Obsevable, Flowable etc) in Activity/Fragment onStop(). And if we speak about what is the best we could do with it I think in general we just don't need commit fragments transactions after onSaveInstanceState() was called.

We use a lot of Rx code in our projects and we've forgotten about described crashes since we started clear all related to screen subscribtions in onStop() (but we used to do it in onDestroy() untill SKD implementation of FragmentTransactions was changed).

mrArtCore avatar Nov 29 '18 19:11 mrArtCore

@mrArtCore it's very good that you learned how to work with RxJava. But you can believe that none of us use calls after onSaveInstanceState, and yet the error appears. What exactly do you suggest?

tim4dev avatar Dec 07 '18 06:12 tim4dev

@tim4dev Hey, I don't like your sarcasm. First of all I tried to help. It appears that not all of users of this library quite familiar with Rx. My suggestions:

  • give comprehensive example of your code or which is better link to sample project where this crash could be reproduced with more than 50% of success.
  • describe steps to reproduce
  • some additional info, that might be handy.

Show only stacktrace - is nothing. It's very hard understand what's going on if you will be look for problem solving without viewing from different perspectives.

This is an open source project, remember ? Nobody get paid for that fix. And if you are interested in this fix - give some help, please. Describe problem correctly!

mrArtCore avatar Dec 07 '18 12:12 mrArtCore

Possible duplicate of https://github.com/tbruyelle/RxPermissions/issues/132 and https://github.com/tbruyelle/RxPermissions/issues/125

mrArtCore avatar Dec 07 '18 12:12 mrArtCore

so,will you change commitNow() to commitAllowingStateLoss()? @tbruyelle

imxy avatar Jan 17 '19 06:01 imxy

Same problem. It is hard to reproduce and seems like a random error.

stargt avatar Feb 20 '19 06:02 stargt

Show us your code. Thats all. Oh, and stacktrace. And example project will be super helpful

mrArtCore avatar Feb 20 '19 16:02 mrArtCore

@mrArtCore This is one of the crash logs from Crashlytics. hasRightPermission is for getting whether a permission has been granted.

Fatal Exception: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
       at android.support.v4.app.FragmentManagerImpl.checkStateLoss(Unknown Source:10)
       at android.support.v4.app.FragmentManagerImpl.ensureExecReady(Unknown Source:51)
       at android.support.v4.app.FragmentManagerImpl.execSingleAction(Unknown Source:11)
       at android.support.v4.app.BackStackRecord.commitNow(Unknown Source:6)
       at com.tbruyelle.rxpermissions2.RxPermissions.getRxPermissionsFragment(Unknown Source:24)
       at com.tbruyelle.rxpermissions2.RxPermissions.access$000(Unknown Source)
       at com.tbruyelle.rxpermissions2.RxPermissions$1.get(Unknown Source:9)
       at com.tbruyelle.rxpermissions2.RxPermissions$1.get(Unknown Source)
       at com.tbruyelle.rxpermissions2.RxPermissions.isGranted(Unknown Source:8)
       at com.testapp.TestActivity.hasRightPermission(Unknown Source:9)
       at com.testapp.TestActivity.onCreateOptionsMenu(Unknown Source:37)
       at android.app.Activity.onCreatePanelMenu(Activity.java:3567)
       at android.support.v4.app.FragmentActivity.onCreatePanelMenu(Unknown Source:2)
       at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(Unknown Source:2)
       at android.support.v7.app.AppCompatDelegateImpl$AppCompatWindowCallback.onCreatePanelMenu(Unknown Source:8)
       at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(Unknown Source:2)
       at android.support.v7.app.ToolbarActionBar.populateOptionsMenu(Unknown Source:24)
       at android.support.v7.app.ToolbarActionBar$1.run(Unknown Source:2)
       at android.os.Handler.handleCallback(Handler.java:873)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:214)
       at android.app.ActivityThread.main(ActivityThread.java:6981)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)

stargt avatar Apr 01 '19 01:04 stargt

Hi @stargt ! I see you have some testapp and just may be you are able to reproduce this crash ? And what's more important that is code how you request permissions. Could you share it ?

mrArtCore avatar Apr 01 '19 08:04 mrArtCore

I meet the same Exception

wangjiangtao avatar Apr 03 '19 08:04 wangjiangtao

@wangjiangtao Guys, how about to show code ? Did you check this and this comments ?

Read carefully please, and if this is doesn't solve your problems, give us yout code example.

mrArtCore avatar Apr 03 '19 08:04 mrArtCore

我fork了一份解决了这个问题,比楼上的延时处理更好 https://github.com/YougaKing/RxPermissions.git

老哥,,,你的pull request 未被允许呀

xmc91 avatar Apr 08 '19 08:04 xmc91

我也是 不提供解决方案吗

small-tree avatar Jun 20 '19 03:06 small-tree

0.10.2 still have this problem java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at android.support.v4.app.FragmentManagerImpl.checkStateLoss(SourceFile:2080) at android.support.v4.app.FragmentManagerImpl.ensureExecReady(SourceFile:2219) at android.support.v4.app.FragmentManagerImpl.execSingleAction(SourceFile:2239) at android.support.v4.app.BackStackRecord.commitNow(SourceFile:648) at com.tbruyelle.rxpermissions2.b.b(SourceFile:77) at com.tbruyelle.rxpermissions2.b.a(SourceFile:36) at com.tbruyelle.rxpermissions2.b$1.get(SourceFile:61) at com.tbruyelle.rxpermissions2.b$1.get(SourceFile:54) at com.tbruyelle.rxpermissions2.b.isGranted(SourceFile:308) at **showPermission(SourceFile:25) at **.onClick(SourceFile:332) at android.view.View.performClick(View.java:6324) at android.view.View$PerformClick.run(View.java:24977) at android.os.Handler.handleCallback(Handler.java:790) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:192) at android.app.ActivityThread.main(ActivityThread.java:6814) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:818)

lkang08 avatar Jul 23 '19 09:07 lkang08

This bug is also occasionally found on our side.

zhuxiaohao avatar Oct 16 '19 07:10 zhuxiaohao

@zhuxiaohao @lkang08 Guys, if you provide code where such error could be reproduced (with "steps to reproduce" of course), I'll try to help. This crash affected many users, as I can see now... Guys, messages and stacktraces without code where bug could be represented worth nothing. Nobody want waste so much time here. I've got idea why this crash appear (maybe it's about Permission emission without check for activeObservers) but I have no time to setup enviroment where crash could be reproduced.
Good luck!

mrArtCore avatar Oct 16 '19 19:10 mrArtCore

I don't know what to do with rx methods and I can't create example that can reproduce this exception (I've spend whole evening in tryings and can't reproduce). But exception in rx methods will be emitted into downstream and easy to catch. More important that this exception can be thrown with isGranted methos which isn't rx method. I think, for such non-rx methods creation of fragment can be replaced with ContextCompat.checkSelfPermission methods.

fAntel avatar Nov 28 '19 10:11 fAntel