作者roden (Roden)
看板AndroidDev
標題Fw: [開發] 在不同版本的androidAPP相同性問題
時間Tue Sep 18 23:48:54 2012
※ [本文轉錄自 Android 看板 #1GM9LQSS ]
作者: roden (Roden) 看板: Android
標題: [開發] 在不同版本的androidAPP相同性問題
時間: Tue Sep 18 23:38:00 2012
Hi 板上的各位好。
想請問一下,
小弟寫了一個Android的app,
功能是介面上有個按鈕,
按鈕被按下後,會startActivityForResult
執行zxing(Google的barcode reader)掃瞄條碼,
掃描後,我的app裡撰寫了onActivityResult去接收和處理掃描到的檔案。
此APP在Desire(A8181) Android v2.2.2上執行良好。
不曾發生過錯誤,
但如果安裝到 Android 2.3 或 4.0.4版本的手機上。
就發生錯誤。
這錯誤發生時機是:
每當ZXING掃描完條碼後,
回到APP的視窗,就跑出APP強制關閉的畫面。
錯誤是:
java.lang.RuntimeException: Unable to resume activity
版本差異導致此問題?
因為本人有將class裡的member變數印出來。
在呼叫startActivity之前,member變數是有資料。
但是在onActivityResult時,卻memeber變數變成null。
是否Activity被destory?
這問題困擾小弟許久,起初還以為是手機是雜牌的問題。
可以請問板上各位先進,小弟哪邊需要做改進才能讓APP相容於較新的版本?
資訊若不足,再請告知我一下。
以下是將按鈕加上Listener的片段及startActivityForResult的方法,
已去除不相關的程式碼。
希望能有先進提供解決的方法或一起討論。
謝謝各位
以下為程式碼。
http://pastebin.com/6HfZQUx8
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 106.65.41.232
1F:→ bestpika:左轉 AndroidDev 09/18 23:42
※ 發信站: 批踢踢實業坊(ptt.cc)
※ 轉錄者: roden (106.65.41.232), 時間: 09/18/2012 23:48:54
2F:→ cooper6334:需要的資訊是Crash時LogCat噴的訊息阿 09/19 08:15
3F:→ roden:小弟不才 問題已經解決 稍晚將問題點提供出來 個人錯誤 09/19 09:45
4F:→ roden:本以為問題已經解決,但還是相同問題。是否有先進可協助? 09/19 12:20
5F:推 cooper6334:LogCat裡通常會有一行Caused by:xxxExcaption 09/19 18:56
6F:→ cooper6334:下面是發生的位置,這個才是判斷的重點 09/19 18:56
7F:→ Eior:猜是gc把某個物件清掉了 從這個方向找吧 09/19 22:46
8F:推 sdyy:你的CURRENTWEBPAGE是幾時賦值阿? 09/19 23:50
CURRENTPAGE是在網頁換頁後馬上賦值。現在發現是parent
Activity整個被gc,因為在onActivityResult呼叫前有執行
onCreate。這應該是ram不夠導致。但就算是把變數存到SharePreference
裡,也許能保存下來。
但是layout中的webview就算recreate後,
他本身的session id 也會有差異。
因為我在舊的Webview中已經有登入的record,
這樣我將掃描到的資訊送到網站後,
他會在要求我在登入一次。
有先進有遇過這問題嘛?
希望能夠強制把parent activity給保留下來。
或者能提供一些solution給我呢?
--------------------------------------------
2012/09/22 Solved
問題已經解決了。
原本我APP是去呼叫外部的ZXING,
也就是說是我沒將ZXING包在自己的APP。
雖然ZXING包不包在自己的APP裡,
在使用startActivityForResult都能呼叫成功。
但對於作業系統有一個很大的差異。
在沒將ZXING(外部程式)包進APP(Parent APP)的狀況下,
由於作業系統會認為你的APP(Parent APP)是去呼叫外部程式,
於是,當APP運行在手機規格差的環境上,
在記憶體不足的狀況下,
OS會將其他的Activity(包含Parent APP)GC掉。
等到ZXING(外部程式)運行完畢,
再執行parent APP 的 onActivityResult時,
由於OS知道parent APP不存在,
故會去呼叫onCreate將parent APP建立起來,
這樣的話,原本的global variable也會化為初始值。
進而導致可能有一些exception發生。
若將ZXING(外部程式)包在APP裡,
在記憶體不足的環境下,
作業系統會認為我的APP(Parent APP)和ZXING(外部程式)是同一個程式,
它會優先將其他的ActivityGC掉,
但GC完後,記憶體仍然不足,
作業系統仍將會跳出整個APP。
這樣就只能請使用者換手機拉。
若有其他先進有不同的看法或意見,也歡迎一起討論!
※ 編輯: roden 來自: 39.8.11.82 (09/22 23:57)