2012-10-09 20 views
10

私のAndroidアプリケーションでApplicationクラスがオーバーロードされましたが、私は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(); 
    } 
} 

そして、私の知る限りでは、Applicationオブジェクトは一度だけ作成する必要があり、そうの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が複数回呼び出されているアプリ、この上の任意のアイデアのように思えますか?

注:プロセス= "string" 属性:私のアンドロイドのXMLマニフェストで

  • 、私は アンドロイドを使用ませをしました。
  • はい、は、私は私の初期化ルーチンに私はMyApplication.onCreateを呼び出すない誤っ だと確信しています。
+3

私はActivity.onCreate(通常は構成の変更が発生するたびに呼び出されます)については言及していませんが、Application.onCreate! –

+0

ここにブレークポイントを設定しようとしましたか? – CommonsWare

+0

それは私のデバイス上で再現することができない何か、私はちょうどACRAのレポートからこれを参照してください...もし私がそこに壊れたり、LogCを入れて、onCreateは、スマートフォンとタブレットの両方で一度だけ呼び出されます。 –

答えて

6

スタックトレースを見ると、ACRA.initmakeApplicationを呼び出しているようです。アプリケーションが既に作成されているかどうかを確認するためのコードがいくつかあると思われます。作成しない場合は、ACRA.initの前にsuper.onCreateの呼び出しによって発生します。一般に、onCreateメソッド(ApplicationまたはActivity)をオーバーライドする場合は、実装の最初の行にsuper.onCreateを呼び出し、その後カスタム処理を行うことをお勧めします。私はそのショットを与え、それが物事を修正するかどうかを知るだろう。

+0

それは説明かもしれない。私はsuperの前にinitを使ってACRAを文書化しました。onCreate()を使用して、アプリケーション作成プロセスでできるだけ早く発生する例外をACRAに報告させます。この動作がより多くのユーザーによって報告された場合、私はこれを再考するかもしれません。 –

+0

@Kevin Gaudin - 私もこのエラーがあります – auval

+5

@KevinGaudin - 私はsuper.onCreate()の後にinitを使ってAcraを試しましたが、時には "ACRA#initが2回以上呼び出される"というエラーが表示されます – 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 =のようなものでアクティビティやサービスを探してみてください。つまり、アクティビティ/サービスは2番目のDalvik VMで開始されているため、別のアプリケーションインスタンスが作成されます。

+1

これは私のケースでした。 –

関連する問題