我在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。我知道这不是最好的解决方案,因为您必须重新编码一些内容,但是它对我有用。