项目中在做Facebook延迟深度链接的时候出现了这样的异常,这是一个典型的不能在子线程做更新ui,做activity跳转的异常。
我们都知道,在主线程不能做耗时操作,在子线程不能做更新ui的操作,我这里出现异常的原因就是Facebook给的回调方法里面有一个是参数是hander的回调方法,我获取到信息做判断后直接做了跳转actitvity的操作,所以导致了这样的异常。
看下我代码:
private fun processDelayDeepLink() {
//为安装后接收深度链接,你的应用需要在启动时调用 Facebook SDK 方式中的 AppLinkData.fetchDeferredAppLinkData 。
AppLinkData.fetchDeferredAppLinkData(this@MainActivity, object :AppLinkData.CompletionHandler{
override fun onDeferredAppLinkDataFetched(appLinkData: AppLinkData?) {
// Process app link data
val targetUrl = appLinkData?.targetUri
if (targetUrl != null) {
Log.d(TAG, "App Link Target URL: " + targetUrl!!.toString())
if(targetUrl!!.toString() == "wjapp://he.com/lunch"){
//做你记录的操作,这里添加判断是为了区分在多个deeplink广告点击设置的时候,进行区分是哪个deeplink跳转过来的
Log.d(TAG, "App Link 判断结果:这个是属于广告deeplink字符串: horoscopeapp://he.com/lunch 的广告跳转" )
var intent = Intent(this@MainActivity, SubscriptionActivity().javaClass)
intent.putExtra("isDeepLink","ok")
//错误导致的地方就在这里,不能在子线程里面做更新ui,activity跳转等操作
startActivity(intent)
}else{
Log.d(TAG, "targetUrl == null222" )
}
}else{
//如果不是Facebook的deeplink跳转到这里的话,会走到这一步判断
Log.d(TAG, "targetUrl == null111" )
}
}
})
}
改成这样就好了:
//创建handler对象,重写handleMessage方法,并编写接收处理的逻辑代码
var mHandler = object :Handler(){
override fun handleMessage(msg: Message?) {
when (msg?.what) {
0 -> {
var intent = Intent(this@MainActivity, SubscriptionActivity().javaClass)
intent.putExtra("isDeepLink","ok")
startActivity(intent)
}
}
}
}
//原先的方法改为如下:
private fun processDelayDeepLink() {
//为安装后接收深度链接,你的应用需要在启动时调用 Facebook SDK 方式中的 AppLinkData.fetchDeferredAppLinkData 。
AppLinkData.fetchDeferredAppLinkData(this@MainActivity, object :AppLinkData.CompletionHandler{
override fun onDeferredAppLinkDataFetched(appLinkData: AppLinkData?) {
// Process app link data
val targetUrl = appLinkData?.targetUri
if (targetUrl != null) {
Log.d(TAG, "App Link Target URL: " + targetUrl!!.toString())
if(targetUrl!!.toString() == "wjapp://he.com/lunch"){
//做你记录的操作,这里添加判断是为了区分在多个deeplink广告点击设置的时候,进行区分是哪个deeplink跳转过来的
Log.d(TAG, "App Link 判断结果:这个是属于广告deeplink字符串: horoscopeapp://he.com/lunch 的广告跳转" )
var msg = Message.obtain()
msg.what = 0
mHandler.sendMessage(msg)
}else{
Log.d(TAG, "targetUrl == null222" )
}
}else{
//如果不是Facebook的deeplink跳转到这里的话,会走到这一步判断
Log.d(TAG, "targetUrl == null111" )
}
}
})
}
其实很简单,报错已经提示了:无法在未调用Looper.prepare()的线程内创建处理程序,所以我们在外面创建handler对象,用它来发消息,并在handleMessage()方法里面做你想做的更新ui或者跳转activity的操作就可以了,之前只重视了更新ui,却忽略了跳转activity这一项。