写点什么

微博 SDK 初始化问题 please init sdk before use it. Wb.install()

用户头像
mengxn
关注
发布于: 52 分钟前

按照官方文档进行 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

发布于: 52 分钟前阅读数: 3
用户头像

mengxn

关注

还未添加个人签名 2018.07.25 加入

还未添加个人简介

评论

发布
暂无评论
微博SDK初始化问题 please init sdk before use it. Wb.install()