编译时会报错,信息是:Type checking has run into a recursive problem.Easiest workaround:specify types of your deslarations explicitly.
语言和环境(Andorid studio Kotlin)
本人状态(很久没碰android了,简单地看了下kotlin)
程序主要需求:
上网查询数据,返回结果,执行操作。
代码执行流程 :
1、MainActivity创建一个Handler,接收消息;
2、创建了一个访问网络的类ClassA,将MainActivity传入,其中的函数使用suspend申明,以通过协程挂起,使用IO线程访问网络;
3、MainActivity中通过协程调用ClassA的函数FuncA;
4、FuncA执行完毕后,通过Handler发送消息至MainActivity中的消息接受部分;
5、Handler中执行一部分代码后,再次调用ClassA中的另一个函数FuncB,FuncB执行完成后通过Handler发送消息,问题就出在这里!
简要代码如下:
//1、MainACTIVITY中----------------------------------
mScope.Lanuch{
ClassA.FuncA();
}
//2、ClassA的FuncA中-----------------------------
MainActivity.mHandler.sendMessage(msg)
//3、MainActivity中Handler接受中------------------------
mScope.Lanuch{
ClassA.FuncB();
}
//4、ClassA的FuncB中-------------------------------
MainActivity.mHandler.sendMessage(msg)//这里编译报错
错误表现:
一旦编译就会出现上述错误。
但有一点很神奇的是,一旦我注释掉sendMessage的代码,编译完成后;再取消注释,再执行就能成功编译运行(编译成功并达到了目标)。
核心需求:
其实最核心的功能需求就是协程执行完后,如何传递返回值;
我的问题:
1、目前的用法我感觉是有点别扭的,是应该用广播传值?还是其他方式?
2、这个错误到底指什么,如果说是代码检测到有无限递归的风险而停止编译,那我应该怎么pass掉这个递归的错误检查;
你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答
本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。
因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。
报错原因我不知道。
但是你为啥要在ClassA中调用MainActivity的Handler?回调一般不都是用接口吗?而且你既然用了kotlin和协程,协程可以把异步代码当同步代码写,接口都不用了。
基于kotlin的话,类似这种通讯 建议使用 androidx.lifecycle:lifecycle-livedata-ktx:2.2.0 的 MutableLiveData(观察者模式概念),创建 MutableLiveData,MutableLiveData.observe(注册观察), 网络处理完成后 , MutableLiveData.postValue(数据)通知接收即可