2010-03-15 26 views
7

Đây là một vấn đề rất lạ. Ứng dụng của tôi mà chỉ chạy tốt nhưng bằng cách nào đó nếu tôi rời khỏi điện thoại của tôi cho một hay hai giờ trong khi ứng dụng của tôi đang chạy, tôi nhận được lỗi sau khi tôi trở lại với nó sau này:Android: Khi nào các lớp học được hệ thống tải xuống?

java.lang.NoClassDefFoundError: yoga.database.Manager 
at 
yoga.YogaActivity.openDatabase(YogaActivity.java:294) 
at 
yoga.YogaActivity.initData(YogaActivity.java:275) 
at 
yoga.YogaActivity.onCreate(YogaActivity.java:102) 
at 
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123) 
at 
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417) 
at android.app.ActivityThread.access$2100(ActivityThread.java:116) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:4203) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549) 
at dalvik.system.NativeStart.main(Native Method) 

Tôi biết một thực tế rằng lớp yoga.database.Manager của tôi đã được tải vào thời điểm khi ứng dụng được khởi chạy, nhưng bằng cách nào đó lớp học phải được hệ thống tải xuống khi tôi rời khỏi điện thoại.

Android có tự động hủy lớp sau một số khoảng thời gian nhất định không? Tôi có thể làm gì khi lớp học của tôi bị bốc dỡ?

Lỗi trên khiến ứng dụng của tôi gặp sự cố, nhưng tôi có thể dễ dàng khởi chạy lại ứng dụng và nó chạy tốt.

Sự cố xảy ra chủ yếu trên điện thoại HTC Magic chạy Android 1.6 của tôi.

Trả lời

7

Máy ảo Dalvik hiện không dỡ lớp học. Nếu nó đã làm, nó sẽ chỉ có thể làm như vậy khi tất cả các lớp liên kết với một bộ nạp lớp cụ thể có thể được dỡ bỏ cùng một lúc, mà sẽ không phải là trường hợp trong khi ứng dụng của bạn đang chạy.

Bạn cần kiểm tra đầu ra của logcat để tìm lỗi dẫn đến ngoại lệ này. Một cách để có được một NoClassDefFoundError là cho một cái gì đó để thất bại trong quá trình khởi tạo của lớp trong câu hỏi; nếu điều đó xảy ra thì có thể sẽ có một dấu vết trong nhật ký.

(Tất nhiên, bây giờ đầu ra logcat có thể đã biến mất, nhưng nếu vấn đề lặp lại bạn sẽ muốn chụp lại lần sau.)

+0

Cảm ơn bạn đã nhập! Tôi sẽ nhìn vào logcat. – user277827

+0

@fadden, Bạn có một nguồn/trích dẫn cho * "Dalvik VM hiện không dỡ lớp. Nếu nó đã làm, nó sẽ chỉ có thể làm như vậy khi tất cả các lớp liên kết với một bộ nạp lớp cụ thể có thể được dỡ cùng một lúc" *? – Pacerier

+3

Đối với phần đầu tiên, tôi là nguồn - tôi thường chịu trách nhiệm về thời gian chạy Dalvik vào thời điểm đó (và tiếp tục cho đến đầu năm 2011, ngay trước khi phát triển trong thời gian chạy về cơ bản dừng lại để tập trung vào những gì bây giờ là ART). Phần thứ hai chỉ là cách trình nạp lớp hoạt động. Đối với một lớp được dỡ xuống, không có tham chiếu đến nó, nhưng mỗi lớp được tham chiếu bởi trình nạp lớp và mọi lớp đều tham chiếu đến trình nạp của nó. Vì vậy, cho đến khi một trình nạp và tất cả các lớp mà nó tải không thể truy cập được, GC sẽ không loại bỏ chúng. Tôi không có một tài liệu tham khảo có thẩm quyền để trích dẫn cho điều đó. – fadden

2

Bạn có đang chơi trò chơi với trình nạp lớp tùy chỉnh không?

Tôi hỏi, bởi vì nếu yoga.YogaActivityyoga.database.Manager là các lớp Java chuẩn trong cùng một tệp APK Android, bạn không nên có một trong bộ nhớ và tệp kia không có. Tôi chưa bao giờ thấy các lớp tải xuống Android trên cơ sở một lần - tối thiểu, tôi chưa bao giờ gặp phải vấn đề cụ thể này trước đây.

Ngoài ra:

tôi để lại điện thoại của tôi cho một giờ hoặc hai trong khi ứng dụng của tôi đang chạy

Bạn có thể muốn làm rõ những gì bạn có nghĩa là bằng cách này. Bạn có nghĩa là bạn để lại hoạt động của bạn ở tiền cảnh? Bạn có nghĩa là bạn nhấn HOME và sau đó quay lại sau vài giờ? Bạn có ý gì khác không?

+0

Xin chào, cảm ơn phản hồi của bạn. Tôi không chơi với trình nạp lớp tùy chỉnh và yoga.YogaActivity và yoga.database.Manager là các lớp Java chuẩn trong cùng một tệp APK Android. Để rời khỏi điện thoại, tôi đã để điện thoại trong khi YogaActivity ở phía trước. Sau một lúc, màn hình của điện thoại sẽ tự động tắt và (có lẽ) điện thoại sẽ chuyển sang chế độ ngủ. Khi tôi đánh thức điện thoại, hoạt động nền trước (YogaActivity) sẽ hiển thị trên màn hình nhưng ứng dụng bị lỗi với NoClassDefFoundError. – user277827

+2

Tôi đã gặp phải các probs tương tự. Trong ứng dụng của tôi, một lớp có các biến tĩnh. Sau khi khởi động ứng dụng của tôi và sau đó tắt màn hình, một lúc sau, tôi thấy ứng dụng ở trạng thái không thể. Cụ thể, một biến "public static boolean isInitialized = false;" được sửa đổi chỉ ở một nơi, thành một sự thật, được tìm thấy là sai, mặc dù sự phân công thực sự đã được thực hiện rõ ràng.Các triệu chứng phù hợp với lớp đang giữ tĩnh bị bốc dỡ và nạp lại trong một thời gian dài, nơi hoạt động mà ref'd lớp đã bị giết, và sau đó tái tạo sau này. – Mesocyclone

+4

@Mesocyclone: ​​Rất có thể quy trình của bạn đã bị chấm dứt và sau đó được khởi động lại. Điều đó xảy ra tất cả các thời gian. Không bao giờ không bao giờ không bao giờ bao giờ dựa vào các thành viên dữ liệu tĩnh cho bất cứ điều gì nhiều hơn một bộ nhớ cache hoặc điểm thoáng qua khác cho dữ liệu. – CommonsWare

Các vấn đề liên quan