Странная ошибка при создании приложения для Android

#java #android #integer #save #loading

#java #Android #целое #Сохранить #Загрузка

Вопрос:

Итак, я пытаюсь создать свое первое в истории приложение для 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();
}
  

И после ввода пары значений, кажется, все работает нормально. Однако я не уверен, добавляет ли это предыдущее значение или удаляет его и заменяет его… Я бы предпочел последнее, чтобы предотвратить слишком большой размер файла сохранения.

Комментарии:

1. проверьте, предоставили ли вы разрешение на внешнюю запись

2. Мне не нужно разрешение на внешнюю запись, поскольку я использую внутреннее хранилище, а не внешнее.

Ответ №1:

onDestroy() ненадежен. Просто придерживайтесь onPause() . Кроме того, в общем случае, для методов, которые обрабатывают события, когда действие «прекращается», вы должны вызывать super метод после вашего собственного кода, чтобы гарантировать, что ваш пользовательский код все еще может выполняться.

Другие вещи, которые нужно проверить, могут быть:

  • Является ли метод, который сохраняет выходные данные, заменяя предыдущий файл или просто добавляя к нему?

  • Вы правильно загружаете и сохраняете каждый раз?

  • Если файл загружен правильно, попадает ли значение в TextView ? Возможно, вам потребуется создать анонимный, Runnable который гарантирует, что TextView обновление выполняется основным потоком (UI).

Щедро разбросайте инструкции журнала по всему коду, чтобы отслеживать, каков итог, что вы получаете из файла и т.д.

При диагностике проблем с файлами помогает тестирование на эмуляторе, который предоставляет вам root-доступ к хранилищу устройства.

Комментарии:

1. На моем телефоне разработчика установлен Cyanogen 13, поэтому наличие root-доступа не является проблемой. Однако на самом деле я не могу найти, куда сохранен файл.

2. Попробуйте /data/data/your.app.package.name/files/

Ответ №2:

Вам нужно изменить метод loadValue(). Вы присваиваете fis.read() значению, которое возвращает следующий байт или -1, если EOF достигнут.

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

Комментарии:

1. Это вызывает исключение в main, которое является NumberFormatException: Invalid int: «[]», и когда я помещаю оператор catch для указанного NFE, он просто возвращается к 0 каждый раз, когда я закрываю и запускаю его.