如何在Android中的自定义异常类中将字符串外部化为错误消息

时间:2016-09-21 14:08:34

标签: java android

我有这个班级

public class InternetConnectionException extends RuntimeException {

    int code = 0;

    public InternetConnectionException(){
        super("Internet connection is down");
    }

    public InternetConnectionException(String message){
        super(message);
    }
}

此错误消息不应该是硬编码的。它应该被外部化以便提供不同的语言,因为当抛出此异常时,消息将显示在屏幕上。 现在,有没有办法将其外部化为strings.xml资源,还是应该更改设计? (即抛出此异常时,只需引用活动中的字符串资源并显示已解析的值)

我认为好的设计不应该允许纯Java类(例如异常)知道Android框架的内部,但我可能错了。

1 个答案:

答案 0 :(得分:1)

由于您无法直接访问string.xml,但我可以通过一种方式来实现您尝试完成的任务。

  • 将所有String值放入string.xml
  • 维护另一个java类(比如StringConstant.java),它将保存您需要在其他非Activity / Fragment类中访问的string.xml的一些内容。
  • 扩展Application类(例如,AppApplication.java)并在此处启动StringConstant类的对象
  • 从StringConstant类
  • 加载字符串
  • 通过Application类中的StringConstant实例从其他类访问字符串。

以下是一些展示这个想法的代码

AppApplication.java

public class AppApplication extends Application {

    public static StringConstant STRING_CONSTANT;

    @Override
    public void onCreate() {
        super.onCreate();

        STRING_CONSTANT = new StringConstant(getBaseContext());
        STRING_CONSTANT.build();
    }
}

StringConstant.java

public class StringConstant {

    private Context context;

    public static String appName;
    // declare other String variables


    public StringConstant(Context context) {
        this.context = context;
    }

    public void build(){
        setAppName(context.getString(R.string.app_name));
        // set other String variables
    }

    public static String getAppName() {
        return appName;
    }

    public static void setAppName(String appName) {
        StringConstant.appName = appName;
    }
}

现在从另一个类访问字符串

public class InternetConnectionException extends RuntimeException {

    int code = 0;

    public InternetConnectionException(){
        super(AppAplication.STRING_CONSTANT.getAppName());
    }

    public InternetConnectionException(String message){
        super(message);
    }
}