0

我正在尝试找出一种为我的服务提供首选项文件的好方法,例如活动的 SavedInstanceState。该服务启动,设置警报,并调用 stopSelf();,因为它可能需要几天才能再次运行,我希望它启动,完成它的任务,然后完成。我只是要在逗号分隔的文本文件中使用相同的一些键/值对。

好的,所以我想打开Context提供的FileInputStream,但是我必须处理异常。我宁愿先检查以确保文件存在以避免错误,如果返回大量文件,我想在 UI 线程上完成这项工作。这是我的代码:

public void setNewAlarm() {
    Log.d("alarmServ", "inside setNewAlarm()");

    FileInputStream fis;
    Time time = new Time();
    Boolean prefsAvail = false;
    String[] fileList = fileList();

    Runnable fileCheck = new Runnable() {

        public void run() {
            int i = 0;
            while (i<fileList.length) {
                if (fileList[i] == "preferences") {
                    prefsAvail = true;
                    break;
                }
                i++;
            }
            if (prefsAvail) {
                try {
                    fis = openFileInput("preferences");
                } catch (FileNotFoundException ioe) {
                    Log.d("alarmServ", "i/o error: output file fail");
                    ioe.printStackTrace();
                }
            }
        }
    };

    //do something with the InputStream - read prefs and build alarm based on the criteria
}

那么问题显然是 FileInputStream、boolean 和 String[] 在 runnable 中不可用。我该如何解决这个问题,我的理解是嵌套类可以访问其容器的变量。这不是真的,因为它是在方法中声明的吗?

我尝试使用谷歌搜索,发现这样做的一种方法是将数据声明为最终数据,但这似乎不适用于布尔值或流。

4

1 回答 1

1

如果您只需要保存键/值对,我建议您使用SharedPreferences,这是一种首选的 Android 方式。

此外,如果您打算使用文件,我建议您只在工作线程上运行它,这样您就不需要在线程之间共享您的 FileInputStream、布尔值和 String[]。

PS 要在匿名内部类中使用引用,您必须将其定义为final.

于 2013-07-27T00:15:02.837 回答