项目运行报错:Can't create handler inside thread that has not called Looper.prepare()解决方案

项目中在做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这一项。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值