最近做一個(gè)項(xiàng)目,需要請(qǐng)求文件操作的權(quán)限。功能做好了,自己手機(jī)上測(cè)試,沒有問題。發(fā)給別人,在別人的手機(jī)上問題就來了。在別人手機(jī)上一點(diǎn)就崩潰了。那個(gè)按鈕上的事件是:先進(jìn)行文件操作權(quán)限申請(qǐng),有了權(quán)限就操作文件,然后做UI處理。
首先我懷疑的是權(quán)限申請(qǐng)的代碼可能有什么不兼容,導(dǎo)致App崩潰。我的權(quán)限申請(qǐng)代碼是自己寫的,我懷疑我自己寫的有問題。于是我換了一個(gè)比較流行的權(quán)限申請(qǐng)框架。經(jīng)測(cè)試后,還是不行。
由于手機(jī)并不在我身邊,我看不到日志。于是我又加上了騰訊的bugly。重新打了包,給別人測(cè)試。然后發(fā)現(xiàn)了如下錯(cuò)誤:
AndroidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-1
AndroidRuntime: JAVA.lang.IllegalStateException: Reading a state that was created after the snapshot was taken or in a snapshot that has not yet been applied
……
bugly還是很優(yōu)秀的,還給了我好幾個(gè)可能有用的解決方案。然而細(xì)讀一下,發(fā)現(xiàn)那些解決方案并不適合我遇到的情況。
我有一點(diǎn)兒絕望了,開始求助于其他人了。然而沒有什么用。
我又去看了一眼,bugly給我的解決建議。在一堆中文和英文中,我發(fā)現(xiàn)了一個(gè)單詞,thread。嗯,線程。我開始有些懷疑我代碼中的線程處理了。
再去看看代碼吧,發(fā)現(xiàn)我在IO線程中操作文件,然后回調(diào)了一個(gè)方法,這個(gè)回調(diào)方法中操作了UI界面。于是我在操作完文件后,手動(dòng)切換回了主線程。
再試試吧,發(fā)現(xiàn)問題解決了。