2013-04-03 22 views
5

Ho cercato dappertutto per una risposta e ogni volta che vedo qualcun altro utilizzare il metodo:Perché non posso usare getFilesDir(); in un contesto statico?

getFilesDir(); 

Ma quando provo e uso questo metodo in qualsiasi modo, in particolare:

File myFile = new File (getFilesDir();, filename); 

Eclipse solo dice: "Impossibile rendere il riferimento statico al metodo non statico getFilesDir da tye ContextWrapper"

Sto provando ad usarlo per ottenere la directory interna per scrivere un file per la mia applicazione.

Grazie!

risposta

3

Questo perché nel metodo statico non si ha l'oggetto della classe e getFilesDir non è un metodo statico che significa che sarà accessibile solo tramite l'oggetto della classe Contesto.

Quindi, ciò che è possibile fare è memorizzare il riferimento all'oggetto in una variabile statica della classe e quindi utilizzarlo nel metodo statico.

ad esempio:

static YourContextClass obj; 

static void method(){ 
    File myFile = new File (obj.getFilesDir(), filename); 
} 

anche si dovrà memorizzare il riferimento all'oggetto nella vostra onCreateMethod()

obj = this; 

Il modo migliore per raggiungere questo obiettivo è

static void method(YourContextClass obj){ 
     File myFile = new File (obj.getFilesDir(), filename); 
} 
+1

Hmm, ora fornisce NullPointerException quando viene chiamato? – Jackles

+0

pessima idea ... si finirà con Perdita attività ... – Selvin

+0

Cioè, ora è compilato ma si blocca quando viene chiamato. – Jackles

1

Parlerò di quello che mi è successo. Sto sviluppando un file di sistema di log, quindi ho creato una nuova classe e volevo che fosse per tutta la mia applicazione e con molte istanze di questa classe che facevano registri diversi. Quindi mi propongo di creare oggetti protetti o pubblici della mia classe sulla classe dell'applicazione simile a una classe singleton.

Così ho avuto qualcosa di simile:

 public class MyApp extends Application { 
     protected LogApp logApp = new LogApp(getFilesDir()); 

quando ho chiamato dalla mia classe principale per ottenere i file di elenco, ad esempio:

 public class LogApp { 
     public File dirFiles; 

     //file parameter can't be null, the app will crash 
     public LogApp(File file){ 
      dirFiles = file; 
     } 

     public File[] getListFiles(){ 
      return dirFiles.listFiles() 
     } 

     public class MainActivity extends AppCompatActivity { 
     protected void onCreate(Bundle savedInstanceState) { 
      MyApp myApp = (MyApp)getApplicationContext(); 
      File file[] = myApp.logApp.getListFiles(); 
     } 

Questo mi è stato sempre un errore nullPointException. La soluzione in questo caso è stata così facile che mi sono sentito stufo e orgoglioso allo stesso tempo.

Non è stato possibile chiamare getFilesDir nello spazio dichiarazione MyApp perché in quel momento non c'è un contesto per ottenere Dir. L'ordine di esecuzione in un'app Android è: Applicazione -> Attività. Come è stato detto nel file Manifest.

Soluzione? Creare il mio oggetto in caso onCreate della mia classe MyApp, sembra che questo:

public class MyApp extends Application { 
     protected LogApp logApp; 

     void onCreate(){ 
      logApp = new LogApp(getFilesDir()); 

Così ora posso usare nella mia classe principale nello stesso modo ho fatto perché esiste un'istanza del mio MainActivity che si estende in ultima istanza da Context Class.

Forse ho sbagliato con la spiegazione e questo non è ciò che sta realmente accadendo nei significati della terminologia e come funziona Android.Se qualcuno capisce meglio di me perché funziona, ti invito a chiarire i nostri dubbi.

Spero che questo ti possa aiutare.

Problemi correlati