2010-05-07 13 views
28

Sto lavorando a un'applicazione Android con diverse attività. In esso ho una classe con diversi metodi statici. Mi piacerebbe essere in grado di chiamare questi metodi dalle diverse attività. Sto usando i metodi statici per caricare i dati da un file xml tramite XmlResourceParser. Per creare un XmlResourceParser è necessaria una chiamata sul contesto dell'applicazione. Quindi la mia domanda è, qual è il modo migliore per ottenere un riferimento al contesto dell'applicazione nei metodi statici? Chiedi a ogni attività di ottenerlo e di trasmetterlo? Memorizzalo in qualche modo in una variabile globale?Il modo migliore per ottenere un contesto di applicazione in un metodo statico in Android

+0

Possibile duplicato di [Modo statico per ottenere "Contesto" su Android?] (Http://stackoverflow.com/questions/2002288/static-way-to-get-context-on-android) –

risposta

21

Il modo migliore sarebbe passare l'oggetto Activity come parametro delle funzioni statiche.

AFAIK, non esiste un tale metodo che fornisca il contesto dell'applicazione nel metodo statico.

4

io non sono sicuro che questo sta andando a lavorare per tutto il tempo, ma funziona per me ora:

public class myActivity extends ListActivity 
{ 
    public static Context baseContext; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     baseContext = getBaseContext(); 
    } 

allora si può utilizzare la statica nel pacchetto:

myApplication.baseContext 
+5

Basta essere pronto a trovare baseContext null da contesti statici eseguiti prima che venga chiamato il metodo OnCreate non statico. –

+10

Questo approccio creerà perdite di memoria nel codice. Non farlo! – jpardogo

+0

@jpardogo perdite di memoria multiple ?? Come? – gjpc

2

C'è un post in Sane Tricks per il blog InsaneWorld con una risposta. Si dice che è possibile sostituire l'oggetto Application con la propria sottoclasse e quindi mantenere staticamente il contesto dell'app lì. Puoi trovare codice di esempio nel post.

Il post originale - http://uquery.blogspot.co.il/2011/08/how-to-get-application-context.html

+1

A partire da Android Studio 2.2.2, questo approccio genera un Avviso: "Non inserire classi di contesto Android in campi statici, si tratta di una perdita di memoria (e interrompe anche l'esecuzione istantanea). Un campo statico perderà i contesti." – WilliamK

+1

@WilliamK c'è un'eccezione a questa regola con il contesto dell'applicazione. Vive fintanto che la tua app vive, quindi non può perdere. Non mettere però un contesto di attività in un campo statico! – JensV

2

Questo dovrebbe farti accedere a applicationContext da qualsiasi luogo che consente di ottenere applicationContext da nessuna parte che può essere utilizzato; Toast, getString(), sharedPreferences, ecc. Ho usato questo per ottenere applicationContext all'interno di metodi statici più volte.

Il Singleton:

package com.domain.packagename; 

import android.content.Context; 

/** 
* Created by Versa on 10.09.15. 
*/ 
public class ApplicationContextSingleton { 
    private static PrefsContextSingleton mInstance; 
    private Context context; 

    public static ApplicationContextSingleton getInstance() { 
     if (mInstance == null) mInstance = getSync(); 
     return mInstance; 
    } 

    private static synchronized ApplicationContextSingleton getSync() { 
     if (mInstance == null) mInstance = new PrefsContextSingleton(); 
     return mInstance; 
    } 

    public void initialize(Context context) { 
     this.context = context; 
    } 

    public Context getApplicationContext() { 
     return context; 
    } 

} 

inizializzare il Singleton nel Application sottoclasse:

package com.domain.packagename; 

import android.app.Application; 

/** 
* Created by Versa on 25.08.15. 
*/ 
public class mApplication extends Application { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     ApplicationContextSingleton.getInstance().initialize(this); 
    } 
} 

Se io non sono sbagliato, questo ti dà un gancio per ApplicationContext ovunque, lo chiamano con ApplicationContextSingleton.getInstance.getApplicationContext(); Non è necessario cancellarlo in qualsiasi momento, poiché quando l'applicazione si chiude, ciò vale comunque.

ricordarsi di aggiornare AndroidManifest.xml utilizzare questa Application sottoclasse:

<?xml version="1.0" encoding="utf-8"?> 

<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.domain.packagename" 
    > 

<application 
    android:allowBackup="true" 
    android:name=".mApplication" <!-- This is the important line --> 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" 
    android:icon="@drawable/app_icon" 
    > 

prega fatemi sapere se si vede qualcosa di sbagliato qui, grazie. :)

+0

Non so se in questo modo sia il modo migliore per farlo. Ma penso che inizializzare i singleton che necessitano di un contesto all'entrata di 'Application' è una buona idea. In caso contrario, devo passare un 'Context' a' SingletonClass.getInstance (Context) 'ogni volta che lo chiamo ed è davvero fastidioso. – ProtossShuttle

+0

Sì, è un po 'fastidioso, ho usato classi come queste [gPrefs] (https://gist.github.com/kai-kb/0393e6239db3b90a771c) [gString] (https: //gist.github .com/kai-kb/3da8389513c21a671dbe) per combattere questo in una certa misura. – Versa

+0

Questo approccio genera anche un avviso relativo alle perdite e problemi di esecuzione immediata: "Non inserire classi di contesto Android in campi statici (riferimento statico a ApplicationContextSingleton che ha il contesto di campo che punta a Contesto), si tratta di una perdita di memoria (e si interrompe anche Instant Esegui) Un campo statico perderà i contesti – WilliamK

Problemi correlati