所以我正在尝试制作我的第一个Android应用程序。它现在只是一个简单的计数器,但我遇到了一个奇怪的错误。
你知道,我有一个简单的保存和加载功能,一个递增,递减和重置按钮。和一个显示所有值的TextView(见下文)。
现在,当我将值增加到10并关闭应用程序时,它会保存应用程序,当我再次打开应用程序时,它会回复为10.但是,当我再增加到30或100时,关闭并重新启动该值不会粘贴,并以-1或完全不同的值出现。
可能会发生什么?
MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
int value;
TextView textView_value;
final String filename = "tallyCountPlus";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadValue(filename);
textView_value = (TextView) findviewById(R.id.textView_value);
textView_value.setText(Integer.toString(value));
}
/** Called when the user presses the increment button */
public void incValue(View view) {
value++;
textView_value.setText(Integer.toString(value));
}
/** Called when the user presses the decrement button */
public void decValue(View view) {
if (value > 0) {
value--;
}
textView_value.setText(Integer.toString(value));
}
/** Called when the user presses the reset button */
public void resetValue(View view) {
value = 0;
textView_value.setText(Integer.setString(value));
}
@Override
public void onPause() {
super.onPause();
saveValue(filename, Context.MODE_PRIVATE);
}
@Override
public void onResume() {
super.onResume();
loadValue(filename);
textView_value.setText(Integer.toString(value));
}
public void onDestroy() {
super.onDestroy();
saveValue(filename, Context.MODE_PRIVATE);
}
private void loadValue(String name) {
try {
FileInputStream fis = openFileInput(name);
value = fis.read();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private void saveValue(String name, int context) {
try {
FileOutputStream fos = openFileOutput(name, context);
fos.write(value);
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
任何人都知道我的问题是什么?
感谢。
杰米。
编辑:
所以我认为我已经修复了这个错误:
private void loadValue(String filename) {
/* this is wrapped in a try-catch statement */
FileInputStream fis = openFileInput(name);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
StringBuilder = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
value = Integer.parseInt(sb.toString());
fis.close() /* Not sure if this is actually neccessary? */
if (value == -1) {
value = 0;
}
}
private void saveValue(String name) {
/* This is also wrapped in a try-catch statement */
FileOutputStream fos = openFileOutput(name, Context.MODE_PRIVATE);
String data = Integer.toString(value);
fos.write(data.getBytes());
fos.close();
}
在输入几个值后,似乎工作正常。但是,我不确定它是附加还是删除以前的值并替换它...我宁愿后者阻止保存文件变得太大。
答案 0 :(得分:0)
onDestroy()
不可靠。坚持onPause()
。此外,一般情况下,对于在活动即将离开时处理事件的方法,您应该在自己的代码之后调用super
方法,以确保自定义代码仍然可以执行。
要检查的其他事项可能是:
是保存输出替换上一个文件的方法,还是追加的方法?
您每次都正确加载和保存吗?
如果文件已正确加载,是否值为TextView
?您可能需要构建一个匿名Runnable
,以确保主(UI)线程更新TextView
。
在整个代码中自由地填充日志语句,以跟踪记录的内容,从文件中获取的内容等。
在诊断文件问题时,有助于在模拟器上进行测试,从而为您提供对设备存储的root访问权。
答案 1 :(得分:0)
您需要修改loadValue()方法。您将fis.read()分配给返回下一个字节的值,如果达到EOF,则分配-1。
private void loadValue(String name) {
try {
FileInputStream in = openFileInput(name);
InputStreamReader inputStreamReader = new InputStreamReader(in);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
StringBuilder sb = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
sb.append(line);
}
value = Integer.parseInt(sb.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}