在匿名runnable中迭代String [](Android服务)

时间:2013-07-27 00:02:23

标签: android storage android-service runnable

我正在尝试找出一种向我的服务提供首选项文件的好方法,例如活动的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
}

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

我尝试使用谷歌搜索,并发现一种方法是将数据声明为final,但这似乎不适合布尔值或流。

1 个答案:

答案 0 :(得分:1)

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

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

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