Нефункциональная запись и получение ArraryList Android - PullRequest
0 голосов
/ 27 июля 2011

Я использую следующий код для загрузки и записи списка в файл.Это работало, когда я закрывал приложение (его фон) и перезапускал, но теперь это перестало работать, и я не помню, чтобы что-то менялось.Кроме того, список, безусловно, не сохраняется, если я перезагружаю телефон.

List<HashMap<String, String>> painItems = new ArrayList<HashMap<String, String>>();

String serfilename;
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.addscreen);
    // getPainItems from the saved file
    if (loadListFromFile((ArrayList<HashMap<String, String>>) painItems) != null)
        painItems = loadListFromFile((ArrayList<HashMap<String, String>>) painItems);

    serfilename = "hello";

....


private ArrayList<HashMap<String, String>> loadListFromFile(
        ArrayList<HashMap<String, String>> masterlistrev) {
    try {
        FileInputStream fis = openFileInput(serfilename);
        ObjectInputStream ois = new ObjectInputStream(fis);
        masterlistrev = (ArrayList<HashMap<String, String>>) ois
                .readObject();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return masterlistrev;
}

private void writeListToFile(
        ArrayList<HashMap<String, String>> masterlistrev, Context ctx,
        String filename) {

    FileOutputStream fos;
    try {
        fos = ctx.openFileOutput(filename, Context.MODE_PRIVATE);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(masterlistrev);
        oos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

protected void onStop() {
    super.onStop();
    writeListToFile((ArrayList<HashMap<String, String>>) painItems,
            getApplicationContext(), serfilename);
}
protected void onDestroy(){
    super.onDestroy();
    writeListToFile((ArrayList<HashMap<String, String>>) painItems,
            getApplicationContext(), serfilename);
}

Ответы [ 3 ]

0 голосов
/ 27 июля 2011

Вы должны установить имя файла, прежде чем пытаться загрузить данные в onCreate(...).

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.addscreen);

    serfilename = "hello";

    // getPainItems from the saved file
    if (loadListFromFile((ArrayList<HashMap<String, String>>) painItems) != null)
        painItems = loadListFromFile((ArrayList<HashMap<String, String>>) painItems);

    ....
0 голосов
/ 28 июля 2011

Вот мой тестовый класс:

private List<HashMap<String, String>> painItems = new ArrayList<HashMap<String, String>>();
private static final String serfilename = "hello";

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.addscreen);

    // getPainItems from the saved file
    loadListFromFile();

    // here are my tests:
    // at the first run a hash map will be added and with the onStop saved
    // at the next runs the data will be read and logged
    if (painItems.size() == 0) {
        painItems = new ArrayList<HashMap<String, String>>();
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("a", "b");
        painItems.add(map);
    } else {
        Log.d("test", "Key a: " + (String)(painItems.get(0).get("a")));
    }
}

private void loadListFromFile() {
    FileInputStream fis = null;
    ObjectInputStream ois = null;
    try {
        fis = openFileInput(serfilename);
        ois = new ObjectInputStream(fis);
        painItems = (ArrayList<HashMap<String, String>>)ois.readObject();
    } catch (Exception e) {}
    try {
        ois.close();
    } catch (Exception e) {}
    try {
        fis.close();
    } catch (Exception e) {}
}

private void writeListToFile() {
    FileOutputStream fos = null;
    ObjectOutputStream oos = null;
    try {
        fos = getApplicationContext().openFileOutput(serfilename, MODE_PRIVATE);
        oos = new ObjectOutputStream(fos);
        oos.writeObject(painItems);
        oos.close();
    } catch (Exception e) {}
    try {
        oos.close();
    } catch (Exception e) {}
    try {
        fos.close();
    } catch (Exception e) {}
}

protected void onStop() {
    super.onStop();
    writeListToFile();
}

protected void onDestroy() {
    super.onDestroy();
    writeListToFile();
}
0 голосов
/ 27 июля 2011

Похоже, что вы неправильно закрываете файл.Поместите вызов метода Close () ваших потоков в блок finally.Закройте также свой ObjectInputStream.

ObjectOutputStream oos = null;
try {
  fos = ctx.openFileOutput(filename, Context.MODE_PRIVATE);
  oos = new ObjectOutputStream(fos);
  oos.writeObject(masterlistrev);
} 
catch (FileNotFoundException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
}
finally {
  oos.Close();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...