美文网首页kotlin
kotlin开发中遇到的问题

kotlin开发中遇到的问题

作者: 仕明同学 | 来源:发表于2019-06-21 15:18 被阅读7次

1、Fragment中调用getActivity为null的问题

Fragment中调用getActivity为null的问题,没有销毁Activity,一直在前台
我还是想不明白这个为啥为null
Activity肯定是没有销毁的 就是 ViewPager+Adapter

image.png
image.png

发现 lazyLoad() 加载的时机比onAttach()还早

  • Fragment 的生命周期 简直颠覆了我的看法 但是不是这个问题导致到


    image.png

打个日志


image.png
image.png

得出的结果就是在某一次的时候肯定会进来,是谁引起的

image.png image.png

点击上面切换Tab 去加载fragment的时候引起的

Fragment中调用getActivity为null的问题,完美解决

2、data class 中的某些元素始终为固定值,但是我需要手动添加一些特殊的Item

  • 出现的问题的,一个Adapter +RecyclerView实现不同的Item的效果,从后台获取了数据,我们还要本地去加工数据,记住变量可千万不能写private 修饰,这样是改不动的,去掉private 完美解决
image.png
  • 理解的就是私有变量你改不动,但是kotlin给data class 定义数据的时候,可以标明,这就是矛盾

3、在fragment+ViewPager的使用过程中,最好不要在init方法中去mPresenter.attachView(this),当然在Activity中这样去使用是没有问题的

image.png
  • 导致的原因 BasePresenter 会去检查是否绑定了View


    image.png
  • 如果没有绑定就会为抛出异常,强制让我们去检查代码的正确性


    image.png
  • 在我的网络加载框架的过程中,会有一个解绑的动作


    image.png
    image.png
  • 我们知道init 是class在初始化 执行的 ,而在fragment+ViewPager 使用过程中,就会把相隔的那个Fragment销毁了,所以就会导致 mvpView=null 但是呢?切换过去的时候不会重新 init ,所以需要重新的mPresenter.attachView(this)

image.png
  • 完美解决

4、mvpView肯定不为null,为什么还是抛出06-18 16:41:43.890 8931-8931/? E/BasePresenter: kotlin.KotlinNullPointerException

  • 如下面所示的问题结果
06-18 16:41:43.890 8931-8931/? E/BasePresenter: kotlin.KotlinNullPointerException
        at com.xfxb.paperless.mvp.presenter.MainPresenter$updateProduceVoiceRemind$disposable$1.accept(MainPresenter.kt:34)
        at com.xfxb.paperless.mvp.presenter.MainPresenter$updateProduceVoiceRemind$disposable$1.accept(MainPresenter.kt:26)
        at io.reactivex.internal.observers.LambdaObserver.onNext(LambdaObserver.java:63)
        at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:201)
        at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:255)
        at io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:119)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5001)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:736)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:570)
        at dalvik.system.NativeStart.main(Native Method)
image.png
  • 其实就是这一行mvpView?.updateProduceVoiceRemindSuccess(it.data!!)
    image.png
  • 导致的原因是 data是null的不能够直接加上非null判断号,去掉 it.data!! 变更为it.data
    image.png
image.png

5、data Class 和java Bean互用的问题

image.png
06-19 17:56:16.390 29637-29637/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.xfxb.paperless.prd.debug, PID: 29637
    java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter chocoBoard
        at com.xfxb.paperless.mvp.model.bean.SkuPackDetailInfo.<init>(PackagerOrderDetailResponseBean.kt)
        at com.xfxb.paperless.weight.TipDialog$3.onClick(TipDialog.java:178)
        at android.view.View.performClick(View.java:4453)
        at android.view.View$PerformClick.run(View.java:18514)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5001)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:736)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:570)
        at dalvik.system.NativeStart.main(Native Method)
image.png

  • image.png
  • 改为


    image.png
  • 完美解决问题

6、如果对kotlin 一个null的对象进行强转的话,后续代码不会执行

  val orderId= MemoryCache.getInstance().get(MemoryCache.SELECTED_ORDER_ID) as String

  • 如果 MemoryCache.getInstance().get(MemoryCache.SELECTED_ORDER_ID) 取出来是null,就不会执行后面的代码了,而且还不输出什么日志

  • 这其实也是Kotlin和Java之间互用的问题,Java对Null不太敏感

相关文章

网友评论

    本文标题:kotlin开发中遇到的问题

    本文链接:https://www.haomeiwen.com/subject/skvwzqtx.html