gpt4 book ai didi

android - IllegalThreadStateException OneSignal 崩溃解决方法

转载 作者:行者123 更新时间:2023-12-02 11:18:12 25 4
gpt4 key购买 nike

根据 中提到的错误,我们的应用每天会收到大约 1k 次崩溃。 OneSignal的 github issues .

错误说明:

不幸的是,我无法重现此问题。所有的崩溃都来自
Crashlytics 报告。 SDK 版本 3.12.4

设备:

1) Samsung: Galaxy A5(2017), Galaxy S8, Galaxy A50, Galaxy S10+, Galaxy S10  
2) Xiaomi: Mi A2, Mi A2 lite, Mi A1, Mi A3, Redmi Note 5 Pro
3) Oneplus: ONEPLUS A6010, OnePlus5T, GM191011, GM19008, OnePlus58

堆栈跟踪:
Caused by java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:724)
at com.onesignal.OneSignalPrefs$WritePrefHandlerThread.startDelayedWrite(OneSignalPrefs.java:117)
at com.onesignal.OneSignalPrefs.startDelayedWrite(OneSignalPrefs.java:183)
at com.onesignal.OneSignal.setAppContext(OneSignal.java:601)
at com.onesignal.OneSignalSyncServiceUtils.doBackgroundSync(OneSignalSyncServiceUtils.java:175)
at com.onesignal.SyncJobService.onStartJob(SyncJobService.java:40)
at android.app.job.JobService$1.onStartJob(JobService.java:62)
at android.app.job.JobServiceEngine$JobHandler.handleMessage(JobServiceEngine.java:108)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:280)
at android.app.ActivityThread.main(ActivityThread.java:6748)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

问题:

主要问题是他们将其标记为中等优先级,并且存在大约 3 个月的错误。就因为这个问题,我们的生命体征正在折腾。这让我们付出了很多。

是否存在可以暂时解决问题的解决方法?

PS:

如果需要,我准备提供更多相关信息。提前致谢!

最佳答案

您有可能(如果不太可能)拥有旧版本的 OneSignal,其中 synchronized void startDelayedWrite()不是 synchronized .在这种情况下,我会更新,看看是否能解决问题。如果没有看到以下内容:

有问题的异常(exception)发生在这里:

synchronized void startDelayedWrite() {
if (mHandler == null) {
start();
mHandler = new Handler(getLooper());
}
//rest of function irrelevant.

Thread.start 的 Javadoc ,声明如下:

It is never legal to start a thread more than once. In particular, a thread may not be restarted once it has completed execution.



由此和 Thread.start的实现| ,我们可以推断出有问题的线程正在启​​动两次。

对于 this将在 startDelayedWrite 中启动两次, new Handler(getLooper())需要抛出异常,否则我们不会再次输入这个if语句。我看不到 getLooper() 的任何方法抛出异常,但 new Handler ,当然可以,如果 getLooper()一片空白。
getLooper()的执行如下:
public Looper getLooper() {
if (!isAlive()) {
return null;
}
//rest omitted b/c irrelevant

有问题的线程可能退出的唯一方法是 Thread.run早早退出。

线程的运行实现如下所示:
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
Looper.loop , 旨在成为从消息队列中读取的半无限循环。

请注意 Looper.loop 中的以下内容:
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}

所以如果 msg == null ,然后我们的线程很快退出,可能会导致 mHandler = new Handler(getLooper());中的异常,导致 Thread.start被调用两次。

还有其他合理的解释。例如, Looper.loop 可能在较早的时候崩溃。

为了减轻这种情况,我会添加一个 try{} finally{}阻止 mHandler = new Handler(getLooper()); , 来处理 Looper 的情况已经退出。或者我可能错了,这种竞争条件可能是由完全不同的东西引起的。

关于android - IllegalThreadStateException OneSignal 崩溃解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60500570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com