2015-07-13 9 views
9

Durch einige vermeintlich "gute" Quellquellen gehen, um die Details und Tricks der Kontextbehandlung in Android zu lernen Ich bin auf ein Muster mehrfacher Zeit gestoßen, das ich nicht schaffe verstehen.Warum ContextWrapper direkt in einer Aktivität anstelle des impliziten Kontexts von "this" verwenden

Welchen Vorteil hat die Verwendung eines ContextWrappers, wenn Sie den impliziten Kontext genauso gut verwenden könnten?

Zum Beispiel, warum den folgend in einer Aktivitäts Methode verwenden (direkt in einer Aktivitätsklasse definiert)

... 
ContextWrapper cw = new ContextWrapper(getApplicationContext()) 
File filesDir = cw.getFilesDir(); 
... 

Statt nur

... 
File filesDir = getFilesDir(); 
... 

obwohl getFilesDir() in der ContextWrapper Klasse definiert ist Die Aktivität ist sowieso eine Unterklasse von ContextWrapper, so dass Sie trotzdem direkten Zugriff auf die Methode haben.

Welches potenzielle Problem (das ich nicht sehen kann) ist diese zusätzliche Komplexität Adresse?

+0

'Application' erstreckt' ContextWrapper' auch. – tynn

Antwort

6

Ich würde sagen (und ich könnte falsch liegen), dass in dem Szenario (und Kontext), die Sie vorgestellt, möglicherweise keinen Unterschied machen. getApplicationContext().getFilesDir() könnte genauso einfach verwendet werden.

Ich glaube jedoch, ContextWrapper könnte in anderen Szenarien nützlich sein. Soweit ich weiß, ist dies das Adaptermuster. Sie möchten für bestimmte Methoden nur ein anderes Verhalten liefern, während Proxying alle anderen auf den ursprünglichen Kontext Bezug Sie in geben

Schauen Sie sich dieses Stück Code aus RemoteViews.

// RemoteViews may be built by an application installed in another 
// user. So build a context that loads resources from that user but 
// still returns the current users userId so settings like data/time formats 
// are loaded without requiring cross user persmissions. 
final Context contextForResources = getContextForResources(context); 
Context inflationContext = new ContextWrapper(context) { 
    @Override 
    public Resources getResources() { 
     return contextForResources.getResources(); 
    } 
    @Override 
    public Resources.Theme getTheme() { 
     return contextForResources.getTheme(); 
    } 
};