2013-05-22 8 views
5

Ich habe eine Anwendung, die benutzerdefinierten Ausnahmen, wie diese verwendet:Verwenden von Ressourcen in Ausnahmen

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; 
    } 

} 

Natürlich, ich will lo die Fehlermeldung lokalisieren. Ich habe mögliche Lösungen, aber keine von ihnen befriedigt mich.

1) Übergeben Sie "Context" an den Konstruktor, und tun Sie ctx.getString (R.string.error_201) -> Fehler, wie diese Ausnahmen manchmal von MODEL-Klassen geworfen werden, so dass sie keinen Kontext haben

2) Übergeben Sie "Kontext" beim Abrufen der Nachricht in getMessage() -Funktion, -> Fehler, Es ist notwendig, die Super-Methode zu überschreiben, so wie alle anderen Ausnahmen arbeiten.

Lösung Ich habe jetzt: Alle Tätigkeiten in meiner app haben diese onCreate:

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

Very dirty Code ... ich die Lösung nicht mögen. Meine Frage ist dann: Gibt es eine Möglichkeit, auf die Ressourcen ohne den Kontext zuzugreifen? Und am wichtigsten, Wie würde eine Anwendung wie meine dieses Problem lösen?

Antwort

4

Was

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); 
    // ... 

    } 
} 

Auch wenn es war viel Kontext auf unterschiedliche Weise zugreifen können, sollten Sie es nicht tun. Wenn Sie Ausnahmen ausgeben müssen, bei denen Sie den Kontext nicht weitergeben können, sollten Sie in der Lage sein, auf den Kontext zuzugreifen, bevor Sie einen solchen Fehler anzeigen. Ich sehe keinen Grund, warum Sie lokalisierte Fehlermeldungen vom Konstruktor erstellen sollten. Sie können Logcat nicht lokalisierte Versionen protokollieren, wenn Sie benötigen. Und wo Sie etwas in UI anzeigen möchten, sollten Sie Kontext zur Hand haben.

1

Sie können nur ohne Context auf systemweite Ressourcen zugreifen.

Sie benötigen einen Kontext, also würde ich vorschlagen, dass Sie es so schnell wie möglich bekommen und es durch eine statische Methode oder Variable verfügbar machen. Sie machen dasselbe in jeder Aktivität, aber es gibt eine sauberere Methode. Sie sollten eine benutzerdefinierte Anwendung machen, und außer Kraft setzen ihre onCreate(), um die Ressourcen öffentlich zu machen:

public class App extends Application { 
    private static Resources myResources; 

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

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

Das andere, was Sie tun müssen, ist die Anwendung in Ihrem Manifest zu setzen:

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

Jetzt Sie können auf die Ressourcen in all Ihren Aktivitäten zugreifen, ohne Vorbereitungen zu treffen. Ihre benutzerdefinierte Exception-Klasse könnte auch die externalisierten Ressourcen verwenden.

Verwandte Themen