Kotlin Android 实战(一)闪屏页面

看了一些kotlin的语法,但是总觉得不真正写一下不行。

听说kotlin和java完全兼容,写了写发现,最小单位是类(java类中不能写kotlin代码,反之亦然)。

想在新项目中尝试一下的同学不要有顾虑,就像当初使用mvvm,mvp一样,实在不行在换回java呗(哈哈哈)。

本篇从kotlin安装开始到编写一个简单的闪屏页面练练。

首先AS安装kotlin插件:



然后重启as,在项目的project的gradle中添加:

classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.2"


然后是app下的gradle中添加:

apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
kapt {
    generateStubs = true
}
dependencies {
    .../
    kapt 'com.android.databinding:compiler:2.3.0'
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
}

然后创建一个Activity,这时创建的activity就不是我们原来的.class文件了,创建的是.kt文件:



我这里创建了一个叫SplashActivity。

创建之后,分析下我们闪屏会用到Handler来发送延时消息,直接使用handler可能会造成内存泄漏,所以我们去自定义个弱引用的handler。

原来java的写法:

/**
 * 采用弱引用handler 防止内存泄漏
 * Created by ge on 2017/2/16.
 */

public class UIHandler<T> extends Handler {

    protected WeakReference<T> ref;

    public UIHandler(T cls){
        ref = new WeakReference<T>(cls);
    }

    public T getRef(){
        return ref != null ? ref.get() : null;
    }

}

改成kotlin之后:

/**
 * 采用弱引用handler 防止内存泄漏
 * Created by ge on 2017/2/16.
 */

open class UIHandler<T>(cls: T) : Handler() {

    protected var ref: WeakReference<T>? = null

    init {
        ref = WeakReference(cls)
    }

    fun getRef(): T? {
        return if (ref != null) ref!!.get() else null
    }

}

可能一开始,我们直接转会遇到很多语法上的问题,as给我们提供了一个便捷通道,一键直接从java文件转成kotlin文件:



我建议,大家如果是跟我一样刚开始接触,还是试着练习一点点写,锻炼锻炼,如果实在写不出来就转换之后有个参照(小白小白小白)。

而且自动转换毕竟是按照你不知道的规则转,转的对错与否我也不知道。


好了,定义完handler之后就在SplashActivity中使用了,首先定义几个常量:

 // 将常量放入这里
    companion object {

        // 正常跳转到登录界面 常量 防止以后增加业务逻辑
        val MSG_LAUNCH : Int = 0

        // 延时时间
        val SLEEP_TIME = 3000
    }

再定义我们的Handler:

private class SplashHandle(cls : SplashActivity) : UIHandler<SplashActivity>(cls) {

        override fun handleMessage(msg: Message?) {
            super.handleMessage(msg)
            val activity = ref?.get()
            if (null != activity){

                if (activity.isFinishing)
                    return

                when(msg?.what){

                    // 正常跳转到登录界面
                    MSG_LAUNCH -> {
                        activity.startActivity(Intent(activity, LoginActivity::class.java))
                        activity.finish()
                    }
                }
            }
        }
    }


注:java中的switch换成了when。


private val mHandler = SplashHandle(this)

定义runnable:

 val runnable = Runnable {
        kotlin.run {
            val message = mHandler.obtainMessage(MSG_LAUNCH)
            mHandler.sendMessage(message)
        }
    }

注:这里出现了var 和 val两个声明字段,

var是声明可变的变量。

val是声明一个只读变量,可以理解为java中的final,声明的时候必须初始化,生命之后不能改变她的值。


一系列准备工作做好之后就是最后一步调用了,我这里在onResume中使用:

 override fun onResume() {
        super.onResume()

        val start = System.currentTimeMillis()

        /*
        这里计算了两个时间
        两个时间间可以放入判断条件:是否需要自动登录等
         */

        var costTime = System.currentTimeMillis() - start

        val left = SLEEP_TIME - costTime

        // kotlin中取消了java中的三目运算,换成if...else...
        mHandler.postDelayed(runnable, if(left > 0) left else 0)
    }

上面没有提到我们Activity的头部(onCreate),因为里面只有一个setContentView。

setContentView和原来没啥区别,除了java文件替换成.kt文件之外的文件都没有变。


最后贴出闪屏页面的完整代码:

package com.reliable.mihophysical.ui

import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.os.Message
import com.reliable.baselib.utils.UIHandler

import com.reliable.mihophysical.R
import com.reliable.mihophysical.ui.login.LoginActivity

/**
 * 闪屏界面
 * by ge
 */
class SplashActivity : AppCompatActivity() {

    private val mHandler = SplashHandle(this)

    // 将常量放入这里
    companion object {

        // 正常跳转到登录界面 常量 防止以后增加业务逻辑
        val MSG_LAUNCH : Int = 0

        // 延时时间
        val SLEEP_TIME = 3000
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

    }

    override fun onResume() {
        super.onResume()

        val start = System.currentTimeMillis()

        /*
        这里计算了两个时间
        两个时间间可以放入判断条件:是否需要自动登录等
         */

        var costTime = System.currentTimeMillis() - start

        val left = SLEEP_TIME - costTime

        // kotlin中取消了java中的三目运算,换成if...else...
        mHandler.postDelayed(runnable, if(left > 0) left else 0)
    }


    val runnable = Runnable {
        kotlin.run {
            val message = mHandler.obtainMessage(MSG_LAUNCH)
            mHandler.sendMessage(message)
        }
    }

    // 弱引用handler内部类
    private class SplashHandle(cls : SplashActivity) : UIHandler<SplashActivity>(cls) {

        override fun handleMessage(msg: Message?) {
            super.handleMessage(msg)
            val activity = ref?.get()
            if (null != activity){

                if (activity.isFinishing)
                    return

                when(msg?.what){

                    // 正常跳转到登录界面
                    MSG_LAUNCH -> {
                        activity.startActivity(Intent(activity, LoginActivity::class.java))
                        activity.finish()
                    }
                }
            }
        }
    }
}







  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值