2011-12-27 35 views
5

Tôi có một dự án (trong Eclipse) mà tôi đã biến thành Thư viện dự án Android để tái sử dụng một số mã trong một dự án tương tự khác. Tôi nghĩ rằng tôi đã bắn mình trong bàn chân tuy nhiên như tôi nhận được lỗi:Ứng dụng mở rộng lớp học trong thư viện dự án Android?

Unable to start activity ComponentInfo{com.test.scroller1/com.lib.scrolltest.ScrollTestActivity}: java.lang.ClassCastException: android.app.Application cannot be cast to com.lib.scrolltest.resAppVars 

com.lib.scrolltest là Dự án Thư viện của tôi mà instantiates một lớp mở rộng ứng dụng (resAppVars). Trong phương thức onCreate() Tôi gọi:

mRav = (resAppVars) getApplicationContext(); 

Bằng cách này, tôi có thể sử dụng các phương pháp trong đối tượng mRav mà nếu không sẽ có rất nhiều mã trùng lặp trong các lớp khác (ví dụ như đi qua một truy vấn đến một tuyên bố chọn chung trả về một ArrayList các kết quả).

Sự cố ở đây là gì? Có vẻ như tôi đã đạt đến giới hạn trong cách tôi đã triển khai lớp Ứng dụng.

Trả lời

4

Gọi getApplicationContext() trả về đối tượng Application cho ứng dụng hiện tại (ví dụ: ứng dụng sở hữu hoạt động onCreate() đang chạy bên trong).

Trừ khi bạn đang làm điều gì đó kỳ lạ, bạn không thể chọn lớp Application nào được sử dụng. Thậm chí có một ghi chú trong tài liệu hướng dẫn cho Application nói không làm điều này:

There is normally no need to subclass Application. In most situation, static singletons can provide the same functionality in a more modular way. If your singleton needs a global context (for example to register broadcast receivers), the function to retrieve it can be given a Context which internally uses Context.getApplicationContext() when first constructing the singleton.

Bạn chỉ nên tạo một lớp chia sẻ thường xuyên bên trong dự án thư viện của bạn. Hoặc nếu bạn không có nhu cầu về các dự án thư viện chức năng đặc biệt, bạn cũng có thể sử dụng tệp .jar thông thường.

Và nếu bạn cần trạng thái được chia sẻ, chỉ cần biến nó thành dạng đơn. ;)

+0

Cảm ơn nhưng các biến tĩnh (đơn) không phải là cách tốt nhất trong Android. Các vars tĩnh có thể được khởi tạo thành các giá trị mặc định trong một số trường hợp của vòng đời ứng dụng. http://stackoverflow.com/questions/2475978/using-static-variables-in-android http://electronicvendor.com/using-static-variables-in-android/ Tôi đánh giá cao việc bạn dành thời gian để trả lời. – wufoo

+1

Theo như tôi biết, một singleton sẽ tồn tại trong suốt quá trình của ứng dụng của bạn. Quá trình này tồn tại ít nhất là miễn là bất kỳ thành phần không bị phá hủy nào (hoạt động, dịch vụ, v.v.) trong ứng dụng của bạn. –

+0

@wufoo Tôi vẫn không hiểu tại sao các trình đơn tĩnh là xấu. Ý tôi là, bản thân tài liệu Android nói để sử dụng chúng thay vì phân lớp con của lớp Ứng dụng. Làm thế nào nó có thể được như vậy xấu ?? –

3

Mặc dù đây là một bài đăng rất cũ. Tôi gặp phải vấn đề tương tự và giải quyết nó. Vì vậy, tôi nghĩ tôi sẽ đăng giải pháp cho mọi người.

Hóa ra tôi quên khai báo tên ứng dụng được phân lớp trong tệp kê khai. Các android:name nên trỏ đến lớp ứng dụng mở rộng, ngay cả khi nó được xác định trong thư viện tham chiếu.

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" 
    android:name="com.example.lib.MyApp"> 

Sau khi tôi thêm rằng tôi có thể sử dụng ứng dụng mở rộng với (<cast>) getApplication() ở bất kỳ đâu trong dự án của tôi.

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