Восстановление данных с помощью AsyncTask - PullRequest
0 голосов
/ 20 октября 2011

У меня есть метод сохранения, который выполняется во время onPause():

    String save = numberValue.getText().toString();
    FileInputStream fos;

    try {
        fos = openFileOutput(FILENAME,Context.MODE_PRIVATE);
        fos.write(save.getBytes());
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        Toast.makeText(getBaseContext(), "Save has run", Toast.LENGTH_SHORT).show();
    }

и я пытаюсь прочитать этот файл, позвонив

new Loader().execute(FILENAME);

и мой класс Loader выглядит так:

public class Loader extends AsyncTask<String, Integer, String> {

    protected void onPostExecute(String result) {
        textview.setText(result);
    }

    @Override
    protected String doInBackground(String... params) {
        FileInputStream fis;
        String loaded = null;
        try {
            fis = openFileInput(FILENAME);
            byte[] dataArray = new byte[fis.available()];
            while (fis.read(dataArray) != -1) {
                loaded = new String(dataArray);
            }
            fis.close();
            textview.setText(loaded);
            return loaded;
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        return loaded;
    }

}

И я понятия не имею, почему текстовое представление не устанавливается в качестве байтов от FILENAME. Идея состоит в том, что текстовое представление увеличивается, и это число сохраняется при закрытии действия и восстанавливается в текстовое представление при повторном запуске действия.

Он запускается, я знаю, потому что через несколько минут Watch Dog сообщает мне, что фоновая служба из этого приложения потребляет около 50% процессорного времени. Я проверил / data / data // files и файл, в который я пишу, там с правильным значением.

Ответы [ 2 ]

0 голосов
/ 20 октября 2011

Почему бы просто не сохранить нужное вам состояние с помощью метода onSavedInstanceState () ?Запись материала в файловую систему с помощью метода onPause приведет к очень медленному отключению вашего приложения.Из Документация по действию относительно метода onPause :

Вызывается, когда система собирается возобновить предыдущее действие.Обычно это используется для фиксации несохраненных изменений в постоянных данных, остановки анимации и других вещей, которые могут потреблять ресурсы ЦП и т. Д. Реализации этого метода должны быть очень быстрыми, поскольку следующее действие не будет возобновлено до тех пор, пока этот метод не вернется.

Кроме того, из документации по Android:

В ситуациях, когда системе требуется больше памяти, она может убить приостановленные процессы для восстановления ресурсов.Из-за этого вы должны быть уверены, что все ваше состояние будет сохранено к тому времени, когда вы вернетесь из этой функции.В общем случае onSaveInstanceState (Bundle) используется для сохранения состояния каждого экземпляра в действии, а этот метод используется для хранения глобальных постоянных данных (в поставщиках контента, файлах и т. Д.)

Вот откуда я это взял.

0 голосов
/ 20 октября 2011

Вам, вероятно, нужно позвонить своему Loader из onResume(), чтобы это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...