2012-10-09 27 views
10

tôi đã quá tải lớp Ứng dụng trong ứng dụng Android của mình và tôi đang sử dụng hệ thống báo cáo ACRA. Ứng dụng của tôi trông giống như (real source code here):Phương thức lớp Ứng dụng Android trênCreate được gọi nhiều lần

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

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

Và như xa như tôi biết, đối tượng Application nên được tạo ra chỉ một lần, vì vậy phương pháp onCreate nên được gọi là chỉ một lần. Vấn đề là, rằng trong báo cáo sự cố của tôi (từ ACRA) i có điều này:

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) 

Vì vậy, nó có vẻ như ứng dụng onCreate đang được gọi là nhiều lần, bất kỳ ý tưởng về điều này?

GHI CHÚ:

  • Trong xml android tôi manifest, tôi đã làm KHÔNG sử dụng android: quá trình = "string" thuộc tính.
  • Vâng, tôi chắc chắn rằng trong thói quen khởi của tôi tôi không vô tình gọi MyApplication.onCreate.
+3

Tôi không nói về Activity.onCreate (thường được gọi là mỗi lần thay đổi cấu hình xảy ra), nhưng Application.onCreate! –

+0

Bạn đã thử đặt một điểm ngắt ở đây chưa? – CommonsWare

+0

đó là điều tôi không thể tái sản xuất trên thiết bị của mình, tôi chỉ thấy điều này từ báo cáo ACRA ... nếu tôi đột nhập hoặc đặt Log.d, onCreate chỉ được gọi một lần trên cả điện thoại thông minh và máy tính bảng của tôi. –

Trả lời

6

Nếu bạn nhìn vào dấu vết ngăn xếp, có vẻ như ACRA.init đang gọi makeApplication. Tôi nghi ngờ rằng có một số loại mã để kiểm tra xem các ứng dụng đã được tạo ra chưa và nếu không, tạo ra nó và nó được gây ra bởi bạn gọi ACRA.init trước super.onCreate. Nói chung khi ghi đè các phương thức onCreate (cho dù Application hoặc Activity), bạn nên gọi super.onCreate làm dòng đầu tiên triển khai và thực hiện các công việc tùy chỉnh sau đó. Tôi sẽ cho rằng một shot và xem nếu nó sửa chữa mọi thứ.

+0

Đó có thể là một lời giải thích. Tôi ghi lại ACRA với một init trước siêu.onCreate() để cho phép ACRA báo cáo các ngoại lệ sẽ xảy ra càng sớm càng tốt trong quá trình tạo ứng dụng. Tôi có thể cân nhắc lại điều này nếu hành vi này được báo cáo bởi nhiều người dùng hơn. –

+0

@Kevin Gaudin - Tôi đã gặp lỗi này quá – auval

+5

@KevinGaudin - Tôi đã thử Acra với init sau super.onCreate(), và vẫn nhận được "ACRA # init được gọi nhiều lần" lỗi theo thời gian – auval

6

Tôi cũng thấy điều này với ACRA 4.4.0 trong tự nhiên.

Có lẽ một cái gì đó đơn giản như thế này theo phương pháp 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... 

Chỉnh sửa: 12/27/12 Theo dõi điều này, có vẻ như Kevin đã chấp nhận những thay đổi này. Chi tiết có tại đây: https://github.com/ACRA/acra/commit/cda06f5b803a09e9e7cc7dafae2c65c8fa69b861

19

Tôi nghĩ rằng bạn có quy trình bổ sung trong ứng dụng của mình. Đó là lý do tại sao Application.onCreate được gọi nhiều lần. Xem tệp kê khai của bạn và cố gắng tìm hoạt động hoặc dịch vụ với một cái gì đó như android: process =. Điều này có nghĩa là hoạt động/dịch vụ bắt đầu từ máy ảo Dalvik thứ hai, và đó là lý do tại sao một cá thể ứng dụng khác được tạo ra.

+1

Đây là trường hợp của tôi. –