为什么我不能使用getFilesDir();在静态环境中?

时间:2013-04-03 10:15:10

标签: android file methods static

我到处寻找答案,每当我看到其他人使用这种方法时:

getFilesDir();

但是当我尝试以任何方式使用该方法时,尤其是:

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

Eclipse只是说,“不能从tye ContextWrapper对非静态方法getFilesDir进行静态引用”

我正在尝试使用它来获取内部目录来为我的应用程序编写文件。

谢谢!

2 个答案:

答案 0 :(得分:4)

这是因为在静态方法中你没有得到类的对象,而getFilesDir不是一个静态方法,这意味着它只能通过类Context的对象访问。

所以你可以做的是将对象的引用存储在类的静态变量中,然后在静态方法中使用它。

例如:

static YourContextClass obj;

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

您还必须在onCreateMethod()

中存储对象的引用
 obj = this;

实现这一目标的最佳方法是

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

答案 1 :(得分:1)

我要谈谈发生在我身上的事情。我正在开发一个日志系统文件,所以我创建了一个新类,我想要的是我的所有应用程序,并且让这个类的许多实例执行不同的日志。所以我想在类似于单例类的应用程序类上创建我的类的受保护或公共对象。

所以我有类似的东西:

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

当我从我的主类调用它来获取列表文件时,例如:

      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();
      }

这让我遇到了一个nullPointException错误。 在这种情况下的解决方案非常简单,我同时感到愚蠢和骄傲。

我无法在MyApp的声明空间中调用getFilesDir,因为那时候没有一个上下文来获取该Dir。 Android应用程序中的执行顺序是:应用程序 - >活动。就像在Manifest文件中说的一样。

解决方案?在我的MyApp类的onCreate事件中创建我的对象,它看起来像这样:

    public class MyApp extends Application {
        protected LogApp logApp; 

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

所以现在我可以在我的主类中使用它,就像我使用它一样,因为存在一个我的MainActivity实例,它在Context Class的最后一个实例中扩展。

也许我对可能的解释是错的,这不是术语意义上真正发生的事情以及如何运作android。如果有人比我理解为什么这会有效,我邀请你澄清我们的怀疑。

我希望这会对你有所帮助。