我正在尝试找出一种向我的服务提供首选项文件的好方法,例如活动的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,但这似乎不适合布尔值或流。
答案 0 :(得分:1)
如果您只需保存键/值对,我建议您使用SharedPreferences,这是首选的Android方式。
此外,如果您打算使用文件,我建议您只在工作线程上运行它,这样您就不需要在线程之间共享您的FileInputStream,boolean和String []。
P.S。要在匿名内部类中使用引用,您必须将其定义为final
。