Kotlin Android 实战(一)闪屏页面
2017-07-31 13:17
579 查看
看了一些kotlin的语法,但是总觉得不真正写一下不行。
听说kotlin和java完全兼容,写了写发现,最小单位是类(java类中不能写kotlin代码,反之亦然)。
想在新项目中尝试一下的同学不要有顾虑,就像当初使用mvvm,mvp一样,实在不行在换回java呗(哈哈哈)。
本篇从kotlin安装开始到编写一个简单的闪屏页面练练。
首先AS安装kotlin插件:
然后重启as,在项目的project的gradle中添加:
然后是app下的gradle中添加:
然后创建一个Activity,这时创建的activity就不是我们原来的.class文件了,创建的是.kt文件:
我这里创建了一个叫SplashActivity。
创建之后,分析下我们闪屏会用到Handler来发送延时消息,直接使用handler可能会造成内存泄漏,所以我们去自定义个弱引用的handler。
原来java的写法:
改成kotlin之后:
可能一开始,我们直接转会遇到很多语法上的问题,as给我们提供了一个便捷通道,一键直接从java文件转成kotlin文件:
我建议,大家如果是跟我一样刚开始接触,还是试着练习一点点写,锻炼锻炼,如果实在写不出来就转换之后有个参照(小白小白小白)。
而且自动转换毕竟是按照你不知道的规则转,转的对错与否我也不知道。
好了,定义完handler之后就在SplashActivity中使用了,首先定义几个常量:
再定义我们的Handler:
注:java中的switch换成了when。
定义runnable:
注:这里出现了var 和 val两个声明字段,
var是声明可变的变量。
val是声明一个只读变量,可以理解为java中的final,声明的时候必须初始化,生命之后不能改变她的值。
一系列准备工作做好之后就是最后一步调用了,我这里在onResume中使用:
上面没有提到我们Activity的头部(onCreate),因为里面只有一个setContentView。
setContentView和原来没啥区别,除了java文件替换成.kt文件之外的文件都没有变。
最后贴出闪屏页面的完整代码:
听说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() } } } } }
}
相关文章推荐
- Android实现闪屏页面+视频引导页
- Visual Studio跨平台开发实战(5) - Xamarin Android多页面应用程式开发
- Android 开发实战 控件设置及页面跳转
- Android实战页面内容加载动画
- Android启动页面(闪屏页面)的实现
- Kotlin for Android - 实战记录<一>
- Android欢迎页面闪屏解决方法
- Android 使用SwipeBackLayout实现滑动返回上一级页面——实战来袭
- android 游戏 实战打飞机游戏 BOSS的设计 以及胜利失败页面(6结束)
- Kotlin实战(三): 动手撸个玩Android客户端
- Kotlin For Android 示例代码实战
- 解决android在启动闪屏页面前会出现短暂的白屏或黑屏状态
- Android实战打飞机游戏之菜单页面设计(1)
- Android实战简易教程-第二十六枪(基于ViewPager实现微信页面切换效果)
- Android实战简易教程<四十八>(App引导页面效果实现)
- Kotlin For Android 示例代码实战
- Android实战简易教程-第二十六枪(基于ViewPager实现微信页面切换效果)
- Android中使用Handler以及CountDownTimer实现包括倒计时的闪屏页面
- Android中使用Handler以及CountDownTimer实现包含倒计时的闪屏页面
- Android 实战开发 页面跳转数据传递