Autore Topic: richiamo contesto al di fuori dell'Activity  (Letto 5227 volte)

Offline psicomant

  • Utente junior
  • **
  • Post: 95
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    OSX 10.6.5
richiamo contesto al di fuori dell'Activity
« il: 06 Dicembre 2010, 16:22:46 CET »
0
Salve, in seguito ad un mio post, ho recuperato questo snippet che spero possa essere utile.

Se vogliamo recuperare il Context al di fuori dell'activity, perche' magari abbiamo una classe che ne ha bisogno, dobbiamo:

1) nella classe che estende Activity, aggiungere il seguente codice per poi richiamare il contesto di esecuzione all'interno di altre classi che ne avranno bisogno:
Codice (Java): [Seleziona]
public class network extends Activity {
       
    private static network instance;

    public network() {
        instance = this;
    }

    public static Context getContext() {
        return instance;
    }
[...]
}

2) nella classe a cui serve l'istanza del contesto, si fa semplicemente
Codice (Java): [Seleziona]
private static Context context = network.getContext();
Spero di essere stato chiaro.

Saluti

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:richiamo contesto al di fuori dell'Activity
« Risposta #1 il: 06 Dicembre 2010, 16:28:27 CET »
+1
Non mi piace e tecnicamente è errato.

Devi in ogni caso creare un contesto prima di poter utilizzare la variabile instance che è legata ad una variabile membro anche se è effettivamente una variabile di classe.

Ogni nuova instanza della classe network viene cambiata la variabile statica, che quindi è dipendente dalle istanze (cosa che per definizione non deve essere).

Insomma, fortemente sconsigliato l'utilizzo di questo codice.

Il punto è: a cosa ti serve? Perché non passi il contesto all'oggetto che deve usarlo invece di recuperarlo?

Offline psicomant

  • Utente junior
  • **
  • Post: 95
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    OSX 10.6.5
Re:richiamo contesto al di fuori dell'Activity
« Risposta #2 il: 06 Dicembre 2010, 16:34:09 CET »
0
Citazione
Il punto è: a cosa ti serve? Perché non passi il contesto all'oggetto che deve usarlo invece di recuperarlo?

Ho provato a passarlo alla classe a cui serviva tramite una getApplicationContext(), ma non mi andava...ecco perche' ho cercato una soluzione del genere.

Quindi in alternativa che mi consigli?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:richiamo contesto al di fuori dell'Activity
« Risposta #3 il: 06 Dicembre 2010, 16:37:51 CET »
0
Sicuramente ti trovi in un contesto al momento della chiamata... quindi passalo in quel momento (e non parlo di un getApplicationContext ma di un semplicissimo this)!

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:richiamo contesto al di fuori dell'Activity
« Risposta #4 il: 06 Dicembre 2010, 16:42:17 CET »
0
Sicuramente ti trovi in un contesto al momento della chiamata... quindi passalo in quel momento (e non parlo di un getApplicationContext ma di un semplicissimo this)!
quoto,io ad esempio quando devo prendere dei dati dal database faccio cosi, passo l'id o ciò che deve filtrare sulla ricerca, gli passo pure l'activity, cosi avendo l'activity ho sia il context con cui cercare il db, sia l'activity che deve fare startManagingCursor(Cursor c), in teoria non è errato,perchè la chiamata a questa funzione la fa l'activity e nello stesso thread.
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline psicomant

  • Utente junior
  • **
  • Post: 95
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    OSX 10.6.5
Re:richiamo contesto al di fuori dell'Activity
« Risposta #5 il: 06 Dicembre 2010, 16:51:26 CET »
0
Allora, spero di non incasinare di piu il discorso...la mia situazione e' la seguente:

ho un'activity:
Codice (Java): [Seleziona]
public class network extends Activity {[...]
e una classe utility, chiamiamola cosi:
Codice (Java): [Seleziona]
public class SOSBuffer{[...]
All'interno di tale classe, ad un certo punto dichiaro il metodo:
Codice (Java): [Seleziona]
private boolean deviceConnectForBuffer() {
                boolean res = false;
                try {
                        ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
                        if (cm.getActiveNetworkInfo().isConnectedOrConnecting()) {[...]

dove, non riesco ad usare this.

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:richiamo contesto al di fuori dell'Activity
« Risposta #6 il: 06 Dicembre 2010, 16:55:54 CET »
0
Allora, spero di non incasinare di piu il discorso...la mia situazione e' la seguente:

ho un'activity:
Codice (Java): [Seleziona]
public class network extends Activity {[...]
e una classe utility, chiamiamola cosi:
Codice (Java): [Seleziona]
public class SOSBuffer{[...]
All'interno di tale classe, ad un certo punto dichiaro il metodo:
Codice (Java): [Seleziona]
private boolean deviceConnectForBuffer() {
                boolean res = false;
                try {
                        ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
                        if (cm.getActiveNetworkInfo().isConnectedOrConnecting()) {[...]

dove, non riesco ad usare this.

credo che marco intenda questo:
Quando richiami deviceConnectForBuffer(); lo fai all'interno dell'activity,giusto? ecco, il metodo deviceConnectForBuffer invece che lasciarlo senza parametri,lo crei così:
public boolean deviceConnectForBuffer(Activity activity){} e poi,quando devi prendere il contesto fai activity.getApplicationContext().
Quando poi usi il metodo, dall'activity the fai: boolean result = deviceConnectForBuffer(network.this);
PS: i nomi delle classi però con la prima lettera maiuscola...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:richiamo contesto al di fuori dell'Activity
« Risposta #7 il: 06 Dicembre 2010, 16:57:31 CET »
0
Con il metodo che hai suggerito nel primo post dai alla tua classe una dipendenza da un'activity, cosa che non è proprio desiderabile.
Cosa succede ad esempio se cerchi di chiamare quella classe da un'altra activity mentre network non è ancora stata fatta partire? Ti becchi un NullPointerException!

La cosa migliore e più pulita è passare il context nel costruttore della tua classe:

Codice (Java): [Seleziona]
class TuaClasse{

        private mContext;
       
        public TuaClasse(Context context){
                mContext = context;
        }


        //----
}
« Ultima modifica: 06 Dicembre 2010, 16:59:04 CET da Ricky` »

Offline psicomant

  • Utente junior
  • **
  • Post: 95
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    OSX 10.6.5
Re:richiamo contesto al di fuori dell'Activity
« Risposta #8 il: 06 Dicembre 2010, 17:15:14 CET »
0
Citazione
Quando richiami deviceConnectForBuffer(); lo fai all'interno dell'activity,giusto? ecco, il metodo deviceConnectForBuffer invece che lasciarlo senza parametri,lo crei così:
public boolean deviceConnectForBuffer(Activity activity){} e poi,quando devi prendere il contesto fai activity.getApplicationContext().
Quando poi usi il metodo, dall'activity the fai: boolean result = deviceConnectForBuffer(network.this);
PS: i nomi delle classi però con la prima lettera maiuscola...
Questo penso sia un ottimo metodo generale per procedere, passare sempre l'Activity o il Service tra i parametri dei metodi, cosi da essere sicuri del contesto da usare.

Citazione
Con il metodo che hai suggerito nel primo post dai alla tua classe una dipendenza da un'activity, cosa che non è proprio desiderabile.
Cosa succede ad esempio se cerchi di chiamare quella classe da un'altra activity mentre network non è ancora stata fatta partire? Ti becchi un NullPointerException!
Effettivamente cosi vincolo troppo la riusabilita' del codice (anche se nel mio caso, richiamavo la classe "colpevole", solo da dentro l'Activity in esame).

Spero di aver finalmente capito l'antifona! :)

Grazie a tutti!

P.s. spero solo che il fatto di aver postato qui in snippet, non sia fuorviante per nessuno...leggere la discussione fatta, penso sia costruttivo per tutti quelli a cui interessa trattare il problema.

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:richiamo contesto al di fuori dell'Activity
« Risposta #9 il: 06 Dicembre 2010, 17:38:48 CET »
+1
secondo me l'importante è che le discussioni siano costruttive, piuttosto che uno snippet che nessuno prova o commenta,meglio uno sbagliato che poi viene corretto e discusso!
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:richiamo contesto al di fuori dell'Activity
« Risposta #10 il: 07 Dicembre 2010, 11:11:51 CET »
0
All'interno di tale classe, ad un certo punto dichiaro il metodo:
Codice (Java): [Seleziona]
private boolean deviceConnectForBuffer() {
                boolean res = false;
                try {
                        ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
                        if (cm.getActiveNetworkInfo().isConnectedOrConnecting()) {[...]

dove, non riesco ad usare this.

Mmm... questo mi fa capire che non hai ben chiaro che cosa significa this... e diciamo che questa è una cosa alquanto grave!

this non è altro che un puntatore all'istanza della classe dove viene richiamato, quindi nel contesto del codice di sopra this punta ad una istanza della classe SOSBuffer e non di network. Quindi non è che "non riesci ad usarla", this puoi usarlo in qualunque contesto non statico!

Ti consiglio di ripassare i fondamenti di java! ;)

Ciao!

Offline psicomant

  • Utente junior
  • **
  • Post: 95
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    OSX 10.6.5
Re:richiamo contesto al di fuori dell'Activity
« Risposta #11 il: 15 Dicembre 2010, 01:00:18 CET »
0
Con il metodo che hai suggerito nel primo post dai alla tua classe una dipendenza da un'activity, cosa che non è proprio desiderabile.
Cosa succede ad esempio se cerchi di chiamare quella classe da un'altra activity mentre network non è ancora stata fatta partire? Ti becchi un NullPointerException!

La cosa migliore e più pulita è passare il context nel costruttore della tua classe:

Codice (Java): [Seleziona]
class TuaClasse{

        private mContext;
       
        public TuaClasse(Context context){
                mContext = context;
        }


        //----
}

Come vedi quest'implementazione?
Codice (Java): [Seleziona]
public class Boot extends Service {
[...]
private static Context mContext;
        public Boot(Context context){
                setmContext(context);
        }
       
        public static void setmContext(Context mContext) {
                Boot.mContext = mContext;
        }

        public static Context getmContext() {
                return mContext;
        }

Dall'esterno, dentro un thread che ha necessita' di richiamare tale contesto di questa classe, faro':
Codice (Java): [Seleziona]
Intent i = new Intent(Boot.getmContext(), FeasibilityEngine.class);
Corretto?

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +203
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:richiamo contesto al di fuori dell'Activity
« Risposta #12 il: 15 Dicembre 2010, 08:55:55 CET »
+1
all'interno del service, puoi chiamare getApplicationContext()  per farti dare il Context

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:richiamo contesto al di fuori dell'Activity
« Risposta #13 il: 15 Dicembre 2010, 14:59:10 CET »
0
Quoto Qlimax.

Offline Gambarenerd

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Google+
    • GambareNerd
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Linux Mint
Re:richiamo contesto al di fuori dell'Activity
« Risposta #14 il: 21 Marzo 2013, 17:08:38 CET »
0
Perdonate l'intrusione, ma è invece possibile richiamare un Activity da dentro una classe non activity?
Grazie a tutti.