【问题标题】:Weird bug whilst making android app制作Android应用程序时出现奇怪的错误
【发布时间】:2017-03-04 16:05:21
【问题描述】:

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

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

【问题讨论】:

  • 检查你是否提供了外部写权限
  • 我不需要外部写入权限,因为我使用的是内部存储,而不是外部存储。

标签: java android integer save loading


【解决方案1】:

onDestroy() 不可靠。坚持使用onPause()。此外,一般来说,对于在活动“消失”时处理事件的方法,您应该在您自己的代码之后调用super 方法,以确保您的自定义代码仍然可以执行。

其他需要检查的事项可能是:

  • 保存输出的方法是替换之前的文件,还是只是追加到它?

  • 您每次都正确加载和保存吗?

  • 如果文件被正确加载,它的值是否进入TextView?您可能需要构造一个匿名的 Runnable,以确保 TextView 由主 (UI) 线程更新。

在整个代码中大量添加日志语句,以跟踪计数是什么,从文件中得到什么等。

在诊断文件问题时,它有助于在模拟器上进行测试,这使您可以访问设备存储的 root 权限。

【讨论】:

  • 我的开发手机上有 Cyanogen 13,因此拥有 root 访问权限不是问题。但是,我实际上无法找到文件的保存位置。
  • 试试/data/data/your.app.package.name/files/
【解决方案2】:

您需要修改 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();
    }
}

【讨论】:

  • 这会导致 main 中的异常是 NumberFormatException: Invalid int: "[]" 并且当我为所述 NFE 放置一个 catch 语句时,每次我关闭并启动它时它都会回到 0 .
猜你喜欢
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 2018-11-08
  • 2017-09-22
  • 2011-02-09
  • 2019-05-22
相关资源
最近更新 更多