2011-07-27 12 views
0

次のコードを使用して、リストをファイルにロードして書き出します。これは、アプリケーションを閉じて(バックグラウンド)、再起動したときに機能していましたが、現在は機能しなくなりました。さらに、電話機を再起動すると、リストは確実に保存されません。非機能的な書き込みとArraryListの取得Android

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

答えて

0

正しくファイルを閉じていないように見えます。ストリームの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(); 
}
+0

あなたは私のOnDestroy()とOnStop()メソッドのオーバーライドが正しくフォーマットされていると思いますか?電話機を再起動したり、バックグラウンドにしてもリストが正しく保存されますか?ヒントをありがとう、私はそれを試してみましょう。 – Kgrover

+0

これらは、ログファイルなどに書き込んで、呼び出されたときに参照しようとします。 –

+0

これらのonStop()およびonDestroy()でsuperメソッドを呼び出す前に、writeListToFile()を実行する必要がありますか? – Kgrover

0

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

ありがとうございます。私はこれをやったが、これは問題を解決していないようだ。 – Kgrover

0

私のテストクラス:

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(); 
} 
関連する問題