我在Activity onPause方法中有一个要保存到SharedPreferences的对象的ArrayList。当我尝试将其序列化为json时,我在日志中得到以下内容(这2条语句重复并重载了logcat):

06-20 20:33:31.620  26245-26252/com.example.app W/art﹕ Suspending all threads took: 21.556ms
06-20 20:33:31.620  26245-26260/com.example.app W/art﹕ Suspending all threads took: 5.901ms
06-20 20:33:31.650  26245-26260/com.example.app I/art﹕ Background partial concurrent mark sweep GC freed 210493(6MB) AllocSpace objects, 87(2MB) LOS objects, 25% free, 47MB/63MB, paused 16.970ms total 155.761ms
06-20 20:33:32.480  26245-26260/com.example.app I/art﹕ Background sticky concurrent mark sweep GC freed 346396(10MB) AllocSpace objects, 140(4MB) LOS objects, 14% free, 48MB/56MB, paused 13ms total 88.199ms

我在onCreate中初始化ArrayList,然后在执行完Asynctask后将其提供给对象。这是导致UI卡住的问题方法:
  @Override
  protected void onPause() {
  super.onPause();
  String json = mGson.toJson(mSelectedContactList);
  mSharedPreferences.edit().putString("contact_list", json).apply();
  }

我也尝试了以下方法并继续卡住:
    JsonElement element =
    mGson.toJsonTree(mSelectedContactList, new TypeToken<ArrayList<ContactObject>>() {
    }.getType());
    String jsonString = element.getAsJsonArray().getAsString();

我知道不是SharedPreferences才是问题所在。我怀疑toJson方法无法处理该过程,但是我无法弄清楚这里出了什么问题。任何帮助都感激不尽。

*编辑:这是我正在使用的类:
public class ContactObject implements Parcelable {

// Instance variables
private String mID;
private String mNumber;
private String mName;
private boolean mHasPhoto;
private ArrayMap<Long, InboxSmsObject> mSentMessages;
private ArrayMap<Long, OutboxSmsObject> mReceivedMessages;
...
}

最佳答案

我也有类似的问题。我几乎可以保证问题是由于GSON很难序列化您的InboxSmsObject或OutboxSmsObject对象。 ContactObject类看起来很简单,但是您必须记住GSON还必须序列化ArrayMap中的对象。

您应该做的第一件事是尝试将ContactObject类中的这些类中的一个或两个更改为一些简单的类,例如String。我敢打赌,序列化在这种情况下有效。

一旦确认确实如此,就可以研究解决方案。我采用的解决方案是仅使用构造InboxSmsObject所需的设置来创建一个简单的类。例如,创建一个名为InboxSmsObjectSettings的类,该类仅具有实例化InboxSmsObject类所需的基本信息(我想这个类仅需要几个字符串)。然后创建一个类似的构造函数

InboxSmsObject(InboxSmsObjectSettings设置)

这样您就可以轻松地从设置中实例化InboxSmsObject。我知道这不是最好的解决方案,因为您必须重新编码一些内容,但是它对我有用。

10-05 22:54