前沿:本博客仅供大家参考交流,大神绕行,不喜勿喷.
使用工具:android studio3.0 默认支持kotlin,本文只为了摸索kotlin,有可能会出现好多细节问题,如果大家看到还请大家指明
1.本文的分包基本为
2.以下是view层对应的接口,用来网络请求presenter 拿到参数
interface IloginInfoView { //接口参数为 username和pwd, 额外的传个handler是为了在子线程请求到数据之后,在主线程回调 var userName: String var pwd: String var UIHandler: Handler fun onResponse(response: String) fun onFailure(e: String?= "网络请求失败") }
3.loginactivity页面实现该接口,并进行网络请求
class LoginActivity : AppCompatActivity(), IloginInfoView { private var handler: Handler = object : Handler() { //此处的object 要加,否则无法重写 handlerMessage override fun handleMessage(msg: Message?) { super.handleMessage(msg) if (msg?.what == 0) { Toast.makeText(applicationContext, "子线程消息", Toast.LENGTH_LONG).show() } } } lateinit var loginPresenter: LoginPresenter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //使用kotlin之后,再也不用findviewbyid,是不是很爽,感觉J神的黄油刀也可以不用了 button.setOnClickListener(View.OnClickListener { loginPresenter = LoginPresenter(this) loginPresenter.rqeLogin() }) } override var userName: String = "张三" override var pwd: String = "123456" override var UIHandler: Handler = handler override fun onResponse(response: String) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } override fun onFailure(e: String?) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } override fun onDestroy() { super.onDestroy() loginPresenter.cancleReq() } }
3.模拟网络请求接口回调
class LoginPresenter{ lateinit var iLoginInfoView:IloginInfoView constructor(iLoginInfoView:IloginInfoView){ this.iLoginInfoView = iLoginInfoView } lateinit var loginReq:Call<WrapperRspEntity<User>> fun rqeLogin(){ if(iLoginInfoView != null){ loginReq = RetrofitManager.instance.createReq(LoginApi::class.java) .loginReq(iLoginInfoView.userName, iLoginInfoView.pwd) loginReq .enqueue( object :Callback<WrapperRspEntity<User>>{ override fun onFailure(call: Call<WrapperRspEntity<User>>?, t: Throwable?) { iLoginInfoView.UIHandler.post(Runnable {iLoginInfoView.onFailure(t?.message) }) } override fun onResponse(call: Call<WrapperRspEntity<User>>?, response: Response<WrapperRspEntity<User>>?) { iLoginInfoView.UIHandler.post(Runnable { response?.body() }) } }) } } fun cancleReq(){ if(loginReq != null){ //取消网络请求 loginReq.cancel() } } }
最后,我的retrfit使用很菜,还是不贴关于retrofit的东西,在网络请求返回数据应该有更好的方式进行回调(不考虑 RxJava,RxAndroid的情况),如果有更好的回调方式,非常希望大家给我留言..
刚开博客,加油.... 努力写到更好.