2013-10-19 39 views
0

当我的设备旋转时,我已经开始尝试在我的视图中保留一些数据。由于一段时间后,实施这个我的应用程序将与错误崩溃:@@@ ABORTING:无效地址在dlfree addr = 0x00000156

@@@ ABORTING: INVALID HEAP ADDRESS IN dlfree addr=0x00000156 
Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 20787 (FinalizerDaemon) 

应用程序崩溃每次我试图重新打开它,我立即得到同样的错误,直到我卸载的应用时间之后。

有谁知道是什么原因导致了这个错误?

这里是我用来储存数据的代码:

onDestory()

System.out.println("Saving"); 
    ArrayList<Path> strokes = paintCanvas.strokes; 
    ArrayList<Integer> colors = paintCanvas.colors; 
    SharedPreferences settings = getSharedPreferences("colors", MODE_PRIVATE); 
    settings.unregisterOnSharedPreferenceChangeListener(listener); 



    /**Write Colors**/ 
    try 
    { 
     FileOutputStream os = openFileOutput("drawing.dat", MODE_PRIVATE); 
     ObjectOutputStream output = new ObjectOutputStream(os); 
     output.writeObject(colors); 
     output.close(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    /**Write Paths**/ 
    try 
    { 

     Gson gson = new Gson(); 

     File file = getFileStreamPath("paths.txt"); 
     FileWriter writer = new FileWriter(file); 
     BufferedWriter output = new BufferedWriter(writer); 
     for(Path p : strokes) 
     { 
      String s = gson.toJson(p); 
      s = s + "\n"; 
      output.write(s); 
     } 

     output.close(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     //System.out.println(e.getMessage()); 
    } 

onCreate()

//Try Load here! 
    /**Read Colors**/ 
    try 
    { 
     ArrayList<Integer> colors; 
     ArrayList<Path> strokes; 
     FileInputStream ins = openFileInput("drawing.dat"); 
     ObjectInputStream reader = new ObjectInputStream(ins); 
     colors = (ArrayList<Integer>)reader.readObject(); 

     paintCanvas.colors = colors; 
     System.out.println("Colors Loaded"); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

    /**Read Paths**/ 
    try 
    { 
     FileInputStream fis = openFileInput("paths.txt"); 
     InputStreamReader isr = new InputStreamReader(fis); 
     BufferedReader bufferedReader = new BufferedReader(isr); 
     StringBuilder sb = new StringBuilder(); 
     String line; 
     Gson gson = new Gson(); 

     ArrayList<Path> paths = new ArrayList<Path>(); 
     while ((line = bufferedReader.readLine()) != null) 
     { 
      paths.add(gson.fromJson(line,Path.class)); 
     } 


     paintCanvas.strokes = paths; 
     paintCanvas.currentStroke = paintCanvas.strokes.size() - 1; 
     System.out.println("Paths Loaded"); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
+0

不是你的答案,但你真的想'onDestroy()'?这通常只有在你明确地“完成”你的活动时才会被调用。 'onPause()'或'onStop()'可能是更好的选择。 – Simon

+0

@Simon是,只要设备旋转,就会调用'onDestroy()'。我厌倦了'onStop()',而且它经常储蓄。 – Deekor

回答

0

Path对象是不可序列。我相信这是导致错误的原因,为了解决这个问题,我创建了一个自定义数据结构,它实现了可序列化来保存每条路径的指令,然后构建了我的路径。