toJson出现 ANR问题

没有怎么看懂为什么tojson会出现阻塞,在网上也没有查到

java
"main" prio=5 tid=1 Runnable
group="main" sCount=0 dsCount=0 flags=0 obj=0x71d507d8 self=0xb012c000
sysTid=20173 nice=-10 cgrp=default sched=0/0 handle=0xb43c34a4
state=R schedstat=( 2860652176 664429239 3841 ) utm=159 stm=127 core=3 HZ=100
stack=0xbe729000-0xbe72b000 stackSize=8MB
held mutexes= "mutator lock"(shared held)
at com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:400)
at com.google.gson.stream.JsonWriter.beginObject(JsonWriter.java:307)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:240)
at com.google.gson.Gson.toJson(Gson.java:704)
at com.google.gson.Gson.toJson(Gson.java:683)
at com.google.gson.Gson.toJson(Gson.java:638)
at com.google.gson.Gson.toJson(Gson.java:618)
at com.qinggan.app.music.util.GsonUtil.toJson(GsonUtil.java:12)
at com.qinggan.app.music.model.AppSyncModel.toJson(AppSyncModel.java:33)
at com.qinggan.app.music.btmusic.BTMusicActivity$16.run(BTMusicActivity.java:1230)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6518)
at java.lang.reflect.Method.invoke(Native method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807).java

原因可能是由于在调用toJson()方法时,线程正在等待某个锁,而该锁可能被其他线程占用,从而导致线程阻塞。

ANR(Application Not Responding)是指应用程序无响应,通常是指在应用程序界面上进行某些操作时,应用程序无法及时响应,导致界面卡顿或无响应。这种问题通常是因为主线程(UI线程)在执行耗时操作导致的。在这个问题中,似乎是在执行Gson的toJson方法时出现了ANR。

您可以尝试将toJson方法放在子线程中执行,以避免在主线程上执行耗时操作。或者,您可以检查代码中是否存在其他可能导致主线程阻塞的操作,例如文件I/O、网络请求等,将它们移到子线程中执行。另外,您也可以考虑使用更轻量级的JSON解析库,例如Fastjson或Jackson等。

trace log 中调用栈未必是现场,还要结合 logcat 分析