2012-10-09 54 views
10

我已經在我的android應用程序中重載了應用程序類,並且正在使用ACRA報告系統。 我的應用程序看起來像(real source code here):Android應用程序類方法onCreate被多次調用

public class MyApplication extends Application 
{ 
    @Override 
    public void onCreate() {   
     ACRA.init(this); 

     /* 
     * Initialize my singletons etc 
     * ... 
     * ... 
     */ 
     super.onCreate(); 
    } 
} 

而且據我所知,在申請對象應該只創建一次,所以onCreate方法只應調用一次。 的問題是,在(從ACRA)我崩潰報告,我有這樣的:

java.lang.RuntimeException: Unable to create service it.evilsocket.myapp.net.N ... 
java.lang.RuntimeException: Unable to create service it.evilsocket.myapp.net.NetworkMonitorService: java.lang.RuntimeException: Unable to create application it.evilsocket.myapp.MyApplication: **java.lang.IllegalStateException: ACRA#init called more than once** 
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2283) 
    at android.app.ActivityThread.access$1600(ActivityThread.java:127) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4441) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.RuntimeException: Unable to create application it.evilsocket.myapp.MyApplication: java.lang.IllegalStateException: ACRA#init called more than once 
    at android.app.LoadedApk.makeApplication(LoadedApk.java:495) 
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2269) 
    ... 10 more 
Caused by: java.lang.IllegalStateException: ACRA#init called more than once 
    at org.acra.ACRA.init(ACRA.java:118) 
    at it.evilsocket.myapp.MyApplication.onCreate(MyApplication.java:46) 
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969) 
    at android.app.LoadedApk.makeApplication(LoadedApk.java:492) 
    ... 11 more 
java.lang.RuntimeException: Unable to create application it.evilsocket.myapp.MyApplication: java.lang.IllegalStateException: ACRA#init called more than once 
    at android.app.LoadedApk.makeApplication(LoadedApk.java:495) 
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2269) 
    at android.app.ActivityThread.access$1600(ActivityThread.java:127) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4441) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.IllegalStateException: ACRA#init called more than once 
    at org.acra.ACRA.init(ACRA.java:118) 
    at it.evilsocket.myapp.MyApplication.onCreate(MyApplication.java:46) 
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969) 
    at android.app.LoadedApk.makeApplication(LoadedApk.java:492) 
    ... 11 more 
java.lang.IllegalStateException: ACRA#init called more than once 
    at org.acra.ACRA.init(ACRA.java:118) 
    at it.evilsocket.myapp.MyApplication.onCreate(MyApplication.java:46) 
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969) 
    at android.app.LoadedApk.makeApplication(LoadedApk.java:492) 
    at android.app.ActivityThread.handleCreateService(ActivityThread.java:2269) 
    at android.app.ActivityThread.access$1600(ActivityThread.java:127) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4441) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
    at dalvik.system.NativeStart.main(Native Method) 

所以它看起來像應用程序的onCreate被多次調用,在此任何想法?

注:

  • 在我的Android XML清單,我也使用 安卓過程= 「字符串」 屬性。
  • 是,我敢肯定,在我的初始化程序我是意外 調用MyApplication.onCreate。
+3

我不是在談論Activity.onCreate(通常每次發生配置更改時都會調用它),但是Application.onCreate! –

+0

你有沒有試過在這裏設置斷點? – CommonsWare

+0

這是我無法在我的設備上重現的東西,我剛剛從ACRA報告中看到了這一點......如果我在那裏放置或放置Log.d,onCreate在我的智能手機和平板電腦上只會被調用一次。 –

回答

6

如果您查看堆棧跟蹤,它看起來像ACRA.init正在調用makeApplication。我懷疑有一些代碼來檢查應用程序是否已經創建,如果沒有,創建它,並且它是由super.onCreate之前調用ACRA.init引起的。通常,在覆蓋onCreate方法(無論是Application還是Activity)時,建議將super.onCreate作爲實現的第一行,然後再進行自定義。我會試一試,看看它是否能解決問題。

+0

這可能是一個解釋。我在super之前用init記錄了ACRA。onCreate(),以便讓ACRA在應用程序創建過程中儘快報告將盡快發生的異常。如果此行爲被更多用戶報告,我可能會重新考慮這一點。 –

+0

@Kevin Gaudin - 我也有這個錯誤 – auval

+5

@KevinGaudin - 我試過了super.onCreate()之後的初始化Acra,並且仍然不時發出「ACRA#init不止一次的調用」錯誤 – auval

6

我也看到這與ACRA 4.4.0在野外。

也許像在init方法下這麼簡單?

if (mApplication != null) { 
    throw new IllegalStateException("ACRA#init called more than once"); 
    //(return or finish or gracefully exit somehow)  
} else { 
    mApplication = app; 
    //and then continue with rest of acra init... 

編輯:12/27/12作爲跟進,看起來凱文采取了這些變化。詳情在這裏:https://github.com/ACRA/acra/commit/cda06f5b803a09e9e7cc7dafae2c65c8fa69b861

19

我認爲你在你的應用程序中有額外的過程。這就是爲什麼Application.onCreate被多次調用的原因。看看你的清單文件,並嘗試找到類似android:process =的活動或服務。這意味着活動/服務從第二個Dalvik VM開始,這就是創建另一個應用程序實例的原因。

+1

這是我的情況。 –

相關問題