2013-05-22 38 views
5

Tôi có một ứng dụng có sử dụng ngoại lệ tùy chỉnh, như thế này:Sử dụng tài nguyên trong Exceptions

public class SomeException extends Exception{ 
    private int   iCode; 
    private String  iMessage; 

    public SomeException(){ 
     iCode = 201; 
     iMessage = **//Get the localized string R.string.error_201??** 
    } 


    @Override 
    public String getMessage() { 
     return iMessage; 
    } 


    @Override 
    public int getCode() { 
     return iCode; 
    } 

} 

Rõ ràng, tôi muốn lo bản địa hoá thông báo lỗi. Tôi có những giải pháp khả thi nhưng không ai trong số họ thỏa mãn tôi.

1) Vượt qua "Ngữ cảnh" tới hàm tạo và thực hiện ctx.getString (R.string.error_201) -> Không thành công, vì ngoại lệ này đôi khi được ném từ các lớp MODEL, vì vậy chúng không có Ngữ cảnh

2) Vượt qua "Ngữ cảnh" khi truy xuất thư trong hàm getMessage(), -> Không thành công, cần thiết để ghi đè phương thức siêu, hoạt động như tất cả ngoại lệ khác.

Giải pháp tôi có bây giờ: Mọi hoạt động trong ứng dụng của tôi có onCreate này:

public void onCreate(...){ 
    Utils.RESOURCES = getResources(); 
    ... 
} 

đang rất bẩn ... Tôi không thích giải pháp. Câu hỏi của tôi là ,: có cách nào để truy cập các tài nguyên mà không có Bối cảnh không? Và quan trọng nhất, Làm thế nào một ứng dụng như tôi giải quyết vấn đề này?

Trả lời

4

gì về

public class MyException extends Exception { 
    private int iCode; 

    public MyException(int code) { 
    this.iCode = code; 
    } 

    @Override 
    public String getMessage() { 
    return "MyException code " + String.valueOf(iCode); 
    } 

    public String getLocalizedMessage(Context ctx) { 
    String message; 
    if (iCode == 201) 
     message = ctx.getString(R.string.error_201); 
    else if (iCode == 202) 
     message = ctx.getString(R.string.error_202); 
    // ... 

    } 
} 

Ngay cả khi đã có cách để truy cập nội dung theo cách khác nhau, bạn không nên làm điều đó. Nếu bạn cần phát ra các ngoại lệ mà bạn không thể vượt qua Ngữ cảnh, bạn sẽ có thể truy cập ngữ cảnh trước khi bạn hiển thị lỗi như vậy. Tôi không thể thấy lý do tại sao bạn nên tạo các thông báo lỗi được bản địa hoá từ hàm tạo. Bạn có thể đăng nhập vào logcat không phiên bản được bản địa hóa nếu cần. Và nơi bạn muốn hiển thị một cái gì đó trong giao diện người dùng, bạn nên có ngữ cảnh trong tầm tay.

1

Bạn chỉ có thể truy cập tài nguyên hệ thống rộng mà không có bối cảnh.

Bạn cần một bối cảnh, vì vậy tôi khuyên bạn nên làm cho nó càng sớm càng tốt, và làm cho nó có sẵn thông qua một phương pháp tĩnh hoặc biến. Bạn làm điều tương tự trong mọi Hoạt động, nhưng có một phương pháp sạch hơn. Bạn nên thực hiện một ứng dụng tùy chỉnh, và ghi đè phương thức onCreate() của nó để làm cho nguồn lực công cộng:

public class App extends Application { 
    private static Resources myResources; 

    @Override 
    public void onCreate() { 
     myResources = getBaseContext().getResources(); 
     super.onCreate(); 
    } 

    public static Resources getMyResources(){ 
     return myResources; 
    } 
} 

Một điều khác bạn phải làm là cài đặt các ứng dụng trong biểu hiện của bạn:

<application 
     android:name="{your_package}.App" 
     ... 

Bây giờ bạn có thể truy cập các tài nguyên trong tất cả Hoạt động của mình mà không cần chuẩn bị. Lớp Ngoại lệ tùy chỉnh của bạn cũng có thể sử dụng các tài nguyên bên ngoài.

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