6

我到处寻找答案,每次看到其他人使用该方法时:

getFilesDir();

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

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

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

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

谢谢!

4

2 回答 2

5

那是因为在静态方法中你没有得到类的对象,而 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 );
 }
于 2013-04-03T10:21:26.237 回答
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,因为那时没有获取该目录的上下文。Android App 中的执行顺序是:Application --> Activity。就像清单文件中所说的那样。

解决方案?在 MyApp 类的 onCreate 事件中创建我的对象,如下所示:

    public class MyApp extends Application {
        protected LogApp logApp; 

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

所以现在我可以在我的主类中以与我相同的方式使用它,因为存在我的 MainActivity 的一个实例,它在上下文类的最后一个实例中扩展。

也许我对可能的解释有误,这不是术语含义中真正发生的事情以及android的工作原理。如果有人比我更了解为什么会这样,我邀请您消除我们的疑虑。

我希望这能帮到您。

于 2016-03-04T09:22:53.963 回答