按照官方文档进行 SDK 集成,但运行起来却抛了一个异常。
java.lang.RuntimeException: please init sdk before use it. Wb.install()
at com.sina.weibo.sdk.a.a(SourceFile:62)
at com.sina.weibo.sdk.a.b(SourceFile:76)
at com.sina.weibo.sdk.auth.a.e(SourceFile:149)
at com.sina.weibo.sdk.openapi.a.authorize(SourceFile:1043)
复制代码
集成步骤是没有问题,但还是提示没有初始化。上网查资料,有人提出设置延迟再执行具体代码,可以解决问题。但延迟多少合适呢?不同手机运算性能有差异,是不是也会有影响?这个方案只能治标不治本,也不够优雅。
那让我们来看下 sdk 里面到底做了些什么?
根据 log 信息,我们先定位异常发生的地方
private static void a() {
if (!a) {
throw new RuntimeException("please init sdk before use it. Wb.install()");
}
}
复制代码
此处是一处断言,但变量 a 什么时候赋值为 true,我们不好定位。我们再往上找
public static AuthInfo b() {
a();
return b;
}
复制代码
在返回 AuthInfo 之前进行了断言,我们再往上找,看是哪里调用了
public final void e() {
...
// 获取授权信息
AuthInfo var3 = com.sina.weibo.sdk.a.b()
...
复制代码
看到这里,我们大概明白了,在进行登录授权时,需要拿到授权信息,而获取授权信息时,有一处断言没有通过。
那我们可不可以将断言提前,然后用于判断初始化工作是否完成了呢?我们首先开启一个线程,循环判断断言是否通过,如果通过,那么我们认为初始化工作已完成,然后进行后续操作。
private fun init(block: () -> Unit) {
suspend fun isInit() = suspendCoroutine<Boolean> { continuation ->
CoroutineScope(Dispatchers.Default).launch {
// 循环判断断言是否通过
while (true) {
try {
// 如果没有抛出异常,断言通过,说明初始化已完成,循环结束
a.b()
break
} catch (e: Exception) {
// 抛出异常,说明断言没有通过
}
// 循环间隔50ms
delay(50)
}
continuation.resume(true)
}
}
// 初始化sdk
mApi = WBAPIFactory.createWBAPI(this)
mApi.registerApp(this, AuthInfo(this, "APP_KEY", "REDIRECT_URL", "SCOPE"))
MainScope().launch {
// 初始化成功,然后进行后续操作
if (isInit()) {
block()
}
}
}
复制代码
PS:
本文参考 SDK 版本为:11.6.0
评论