2012-11-08 4 views
13

Irgendwo in der Anwendung muss ich eine lokalisierte Zeichenfolge mit der Methode getString für eine Fehlermeldung abrufen. Dazu benötige ich eine Context-Instanz, beispielsweise aus einer Aktivität. Ist das wirklich so gestaltet? Bin ich wirklich gezwungen, diese Objekte in Klassen und Methoden umzuleiten oder fehle ich den Punkt und gibt es eine andere Möglichkeit, eine String-Referenz zu bekommen?Muss ich Kontextinstanzen wirklich tief in die Anwendung hineinreichen?

Um zu klären, in einer Aktivität habe ich eine innere AsyncTask-Unterklasse, die in DoInBackground eine neue Klasse für einige kurze Netzwerkverarbeitung außerhalb der UI-Thread instanziiert. Ich möchte, dass Fehlermeldungen lokalisiert werden und dafür muss ich eine Context-Instanz (mit anderen Worten die Aktivität) in diese Klasse einbinden. Das Design, Ressourcen aus den XML-Dateien zu beziehen, scheint nur ein bisschen unintuitiv zu sein. Ich frage mich, warum dies so eng mit Context-Instanzen verbunden ist und nicht etwas statisches oder - verzeih mir - ein Singleton, da Context impliziert, der globale Anwendungskontext zu sein und nicht nur ein Teil davon wie eine Aktivität.

+2

Passiert das in einer Utility-Klasse oder so? Sie brauchen einen Kontext für 'getString()', also lautet die kurze Antwort ja. Wenn Sie weitere Details darüber angeben, wo/wie Sie dies aufrufen müssen, gibt es möglicherweise einen besseren Weg als einen Methodenparameter zu übergeben/zu halten. –

Antwort

7

Nein, das sollten Sie nicht tun. Eine einfache Regel ist; Wenn Sie den Kontext für das Berühren der Benutzeroberfläche benötigen oder nur mit den Interna der Aktivitätsklasse verknüpft sind, sollten Sie den Aktivitätskontext verwenden. Selbst dann ist es wichtig, dass jede Bezugnahme auf den Kontext keine Lebensdauer hat, die größer ist als die der Aktivität.

Die große Gefahr nicht zu folgen ist, dass Sie einen Verweis auf den Aktivitätskontext irgendwo tiefer in Ihrem Code ausgeben und Ihre Aktivität zerstört wird, während der Verweis, den Sie halten, immer noch im Umfang ist. Du hast gerade deine Aktivität und alles, worauf sie verweist, durchgesickert. Ich würde empfehlen, den Aktivitätskontext nicht außerhalb der Aktivität zu übergeben, es sei denn wirklich notwendig, und selbst dann, sei sehr sicher, diese Lebenszeit zu kontrollieren.

Also ist der Kontext für etwas, das nicht mit der Benutzeroberfläche verwandt ist, benötigt, wie Ihre Notwendigkeit, eine Zeichenfolge-Ressource zu erhalten, dann den Anwendungskontext verwenden. Innerhalb einer Aktivität, und wo die String-Referenz in der Aktivität deklariert wird, wäre die Verwendung des Aktivitätskontextes akzeptabel und meiner Meinung nach bevorzugt, da Sie eine bewusste Entscheidung hinsichtlich Umfang und Lebensdauer treffen.

Das heißt, Sie sollten fragen, ob diese bestimmte Methode in einer Aktivität besser platziert ist. Es kann nicht sein, aber fragen Sie sich.

Schließlich ein kleiner pedantischer Punkt. Sie übergeben Objekte nirgends. Sie übergeben eine Referenz, in der Tat einen Wert einer Referenz auf das Objekt. Alles in Java wird nach Wert übergeben.

+1

Ich brauche nicht das Kontextobjekt für UI-bezogene Aufgaben, nur für getString, so dass die Anwendung über etwas wie eine State-Klasse verfügbar zu machen scheint stattdessen der Weg zu gehen. Der ganze Hass auf den global verfügbaren Staat (d. H. Singletons) weist mich nur in eine häßlichere Richtung - indem ich Referenzen umlaufe. Und ja, ich weiß, dass Sie in Java Kopien von Referenzen auf Objekte weitergeben, anstatt sie zu kopieren. – dodehoekspiegel

+1

Verwenden Sie einfach getApplicationContext(), Sehen Sie dies für eine gute Diskussion über Anwendungskontext. http://stackoverflow.com/questions/5018545/getapplication-vs-getapplicationcontext BTW, Ihre Anwendung ist ein Singleton, also können die Hasser alles hassen, was sie mögen, aber alles, was sie tun, hängt von Singletons ab :) Ja, viele Möglichkeiten, das zu missbrauchen, aber Anwendungskontext ist nicht einer von ihnen und da es ein Singleton ist, kommt der Status nicht dazu. Der Status Ihrer Anwendungsinstanz ist IS. – Simon

0

Sie könnten die Anwendungsklasse immer erweitern. Erstellen Sie eine statische Methode für getInstace(), um den Kontext abzurufen.

Verwandte Themen