2017-01-22 13 views
0

私のアンドロイドアプリでgsonを使用して、自分のNDAlarmクラスの形式でアラームを保存しています。 しかし、NDAlarmsの配列をjsonに変換しようとすると、アプリケーションがフリーズし、ガベージコレクタが狂ってしまいます![Android] Google Gsonクラッシュアプ​​リ

何が起こっていますか?私の活動の

マイ省コード:

private void SaveAlarms() 
{ 
    Log.d("NewDay", "Saving Alarms"); 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      GsonBuilder builder = new GsonBuilder(); 
      Gson gson = builder.create(); 

      String temp = gson.toJson(_Alarms.toArray(), NDAlarm[].class); 

      _Editor.putString("Alarms",temp); 
      _Editor.commit(); 
      Log.d("NewDay", "Saved Alarms"); 
     } 
    }).start(); 
} 

私はactivity'sポーズオーバーライドでSaveAlarmsを呼び出します。

マイNDAlarmクラス:

public class NDAlarm { 

private long _AlarmTime = 0; 
private PendingIntent _AlarmIntent = null; 

public NDAlarm(long time, PendingIntent intent) 
{ 
    _AlarmTime = time; 
    _AlarmIntent = intent; 
} 

public long get_AlarmTime() { 
    return _AlarmTime; 
} 

public void set_AlarmTime(long _AlarmTime) { 
    this._AlarmTime = _AlarmTime; 
} 

public void set_AlarmIntent(PendingIntent _AlarmIntent) { 
    this._AlarmIntent = _AlarmIntent; 
} 

public PendingIntent get_AlarmIntent() { 
    return _AlarmIntent; 
} 

public DateTime ToDateTime() 
{ 
    return new DateTime(_AlarmTime); 
} 

}

私はgsonと「循環参照」問題と呼ばれるものについて聞いたことがあるが、私はそれを識別するために、どのようにかそれを修正する方法を知っているドント。

お願いします。

+0

クラッシュログも同様に投稿してください。 – dex

答えて

1

私はthis questionが似ていると思います。

あなたの問題はおそらく、PendingIntentオブジェクトをシリアル化しようとすることと関係しています。それはあなたが一時的なものとして、それを宣言する可能性が連載されて停止するには:

private transient PendingIntent _AlarmIntent = null; 

を...それをdeserialising後に設定します。または、その場合に保存するのはアラーム時刻だけなので、共有設定に追加してGsonのものをスキップする方が良いかもしれません。

+0

それを指摘してくれてありがとう!私は実際のPendingIntentの代わりにPendingIntent idを格納し始めました。 – scottyaim

関連する問題