制作Android应用程序时奇怪的bug

时间:2016-10-22 12:08:56

标签: java android integer save loading

所以我正在尝试制作我的第一个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();
}

在输入几个值后,似乎工作正常。但是,我不确定它是附加还是删除以前的值并替换它...我宁愿后者阻止保存文件变得太大。

2 个答案:

答案 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();
    }
}