针对入门级带你实现一个安卓智能家居APP和2kotlin版本这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Eyepetizer-in-Kotlin:一款简约的小视频app,带你走进kotl
针对入门级带你实现一个安卓智能家居APP和2kotlin版本这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Eyepetizer-in-Kotlin:一款简约的小视频app,带你走进kotlin、Java实现一个智能家居控制系统的逻辑过程、Kotlin 学习与实践 (十)Kotlin 的可空性、Kotlin 学习快速入门(2)—— 条件 数组 循环 方法等相关知识,希望可以帮助到你。
本文目录一览:- 入门级带你实现一个安卓智能家居APP(2)kotlin版本(智能家居安卓代码)
- Eyepetizer-in-Kotlin:一款简约的小视频app,带你走进kotlin
- Java实现一个智能家居控制系统的逻辑过程
- Kotlin 学习与实践 (十)Kotlin 的可空性
- Kotlin 学习快速入门(2)—— 条件 数组 循环 方法
入门级带你实现一个安卓智能家居APP(2)kotlin版本(智能家居安卓代码)
前言
上一篇写过java版本的实现,这一篇就写一下kotlin版本的吧。
效果展示 本APP是通过TCP/IP协议与连了WiFi的单片机通信。
其实除了主活动类和新建项目时有一丢丢不同,其他的都是一样的哈~
第一步:
你得会一点点kotlin基础,建议看一本书,是郭霖大神些的《第一行代码》第三版,里面除了安卓的基础教学,还有kotlin的。
第二步:
建议看一本书,是郭霖大神些的《第一行代码》,先入门安卓基础。不想看书就忽略吧,我建议还是看一下最基本的例如:安卓四大组件----活动。
如果你真的一点都不想学。那就先跳过这一步。
第三步:安装Android studio软件。不会安装的小白,看过来!
注意:要安装Android studio,前提一定要安装了jdk环境。
jdk环境怎么安装?如果你电脑已经安装过ecl
Eyepetizer-in-Kotlin:一款简约的小视频app,带你走进kotlin
Google在今年的IO大会上宣布,将Kotlin作为Android开发的一级语言。作为紧跟潮流的弄潮儿,对kotlin稍做了解后,发现其有优秀的特性,所以就开始了学习,而Eyepetizer-in-Kotlin便是对kotlin进行学习后的阶段性成果。
一、screenshot
1.启动界面
2.主界面
3.视频界面
4.搜索界面
5.缓存界面
Github地址:Eyepetizer-in-Kotlin
二、app介绍
1.数据来源
Eyepetizer-in-Kotlin的所有数据来源自开眼视频,不涉及任何商业用途,有如侵权,立即删除。
具体api接口可以参考项目中的Api类。
2.功能
含有开眼视频每日推荐、热门及分类小视频 支持视频播放,包含全屏播放等特性 支持关键词搜索,想看什么看什么 记录历史观看,以及缓存视频,本地播放等功能
3.特点
作为学习kotlin的一款app,在撸代码的过程中学习kotlin的语法及特性。
Eyepetizer-in-Kotlin适合初学者作为学习kotlin语言的一个项目,可以在做项目的同时体验到kotlin语言的优点。
三、kotlin特性
在做Eyepetizer-in-Kotlin的过程中,了解到了许多kotlin的特性,用在日常开发中,大大提高了开发效率,下面就简单介绍下在项目中用到的几个重要的kotlin特性。
(1) 和findViewById说再见
我们可以直接使用xml中对应的id,并且import对应的文件,不在需要findViewById
import kotlinx.android.synthetic.main.activity_watch.*
.........
tv_hint.visibility = View.VISIBLE
tv_hint.text = "告别findViewById"
(2) 延迟加载
延迟加载有几个好处。首先由于加载时机推迟到了变量被访问时,因此它可以提高应用的启动速度。其次,这样的延迟加载也有更高的内存效率。
val mModel: FindDetailModel by lazy {
FindDetailModel()
}
当第一次使用mModle的时候进行初始化
lateinit var mAdapter: DownloadAdapter
在任何想进行初始化的位置进行初始化
(3) Lambdas 表达式
Lambdas 表达式在减少源文件中代码的总行数的同时,也支持函数式编程。
使用 lambdas 表示式时,onClickListener 的用法如下:
holder?.itemView?.setOnClickListener {
var keyWord = list?.get(position)
var intent : Intent = Intent(context,ResultActivity::class.java)
intent.putExtra("keyWord",keyWord)
context?.startActivity(intent)
mDialogListener?.onDismiss()
}
(4) 数据类
数据类简化了类的定义,自动为类添加equals(),hashCode(),copy() 和toString() 方法。它明确定义了 model 类的意图,以及应该包含什么内容,同时将纯数据与业务逻辑分离开来。
data class VideoBean(var feed:String?,var title:String?,var description:String?,
var duration: Long?,var playUrl: String?,var category: String?,
var blurred : String?,var collect:Int?,var share:Int?,var reply:Int?,var time:Long) : Parcelable,Serializable {}
就是如此简单,对比以前动辄几百行的数据类,简洁了太多。如果想实现序列化Parcelable,可以下载支持kotlin序列化的插件,一键实现,非常方便。
(5) 集合过滤
通过使用 Kotlin 的集合过滤功能,我们可以使代码变得更清晰简洁。
bean.issueList!!
.flatMap { it.itemList!! }
.filter { it.type.equals("video") }
.forEach { mList.add(it) }
通过以上过滤,便可以得到我们想要的内容。
(6) 扩展
扩展的好处在于它允许我们为一个类添加功能同时无需继承它。例如,你是否曾经希望 Context 有某些方法,比如 showToast()?使用扩展,你可以很容易实现这个功能:
fun Context.showToast(message: String) : Toast {
var toast : Toast = Toast.makeText(this,message,Toast.LENGTH_SHORT)
toast.setGravity(Gravity.CENTER,0,0)
toast.show()
return toast
}
(7) 其他特性
字符串
Kotlin在字符串之中可以使用变量,相对与在Java中的字符串拼接,更让人感觉到舒服。
holder?.tv_detail?.text = "发布于 $category / $realMinute:$realSecond"
when
Kotlin中when的出现替代了switch,但其功能更加强大。
override fun onClick(v: View?) {
when(v?.id){
R.id.tv_watch ->{
var intent = Intent(activity,WatchActivity::class.java)
startActivity(intent)
}
R.id.tv_advise ->{
var intent = Intent(activity,AdviseActivity::class.java)
startActivity(intent)
}
R.id.tv_save ->{
var intent = Intent(activity,CacheActivity::class.java)
startActivity(intent)
}
}
}
当然Kotlin的特性不止如此,还有更多高阶的特性如:高阶函数, Anko等,这些特性还需进一步学习应用
四、为什么要学Kotlin?
关于为什么要学Kotlin,在Google IO大会刚把kotlin作为一级开发语言后就已经有了很多的讨论。 当时学习的必要性还不明确,过了几个月之后,我们再来看一下学习的必要性。
1.语言层面
通过以上分析,我们可以知道kotlin对于android开发的优势,同时kotlin也是基于JVM的一门静态语言,与Java完美兼容,不存在项目迁移等问题。除此之外,学习成本也比较低,很好入门。当然如果想要达到熟练程度,还需继续练习。
2.形势层面
国外:Pinterest、Evernote、Uber等企业已经开始应用,Google也在一些小项目中应用kotlin,Google一些专家非常看好Kotlin。
国内:据我所知,美团已经开始使用kotlin。一些大型互联网公司由于业务导向,开发压力重,不敢轻易使用kotlin,不过它们已经开始跃跃欲试,着手在新的项目中使用kotlin。
讲了这么多,学习kotlin虽然不是必须的,但是应对趋势发展,并且学习成本不高,那么多掌握一门技能,百利而无一害。
Github地址:https://github.com/LRH1993/Eyepetizer-in-Kotlin
喜欢就给个star,希望能对大家学习kotlin有帮助!
Java实现一个智能家居控制系统的逻辑过程
随着物联网技术的发展,智能家居控制系统已经成为了家居生活的一种趋势。java作为一种非常流行的编程语言,可以用于实现智能家居控制系统的逻辑过程。本文将介绍java实现智能家居控制系统的逻辑过程。
1.系统设计
智能家居控制系统的设计需要考虑以下几个方面:
(1)系统架构
智能家居控制系统通常包括一个中央处理器和多个设备控制器。中央处理器负责接收来自各个控制器的信号,以及向设备控制器发送指令。
立即学习“Java免费学习笔记(深入)”;
(2)通信协议
智能家居控制器之间需要进行通信才能实现互相控制。通常使用无线技术进行通信,如Wi-Fi、ZigBee等。同时,需要制定通信协议以确保各个控制器之间的交互操作是正确的。
(3)用户界面
智能家居控制系统需要提供用户界面,以便用户能够方便地控制设备。用户界面可以是一个手机应用程序或者一个Web应用程序。
2.系统实现
Java是一种开放源代码的编程语言,可以用于实现智能家居控制系统的逻辑过程。Java具有良好的跨平台性和可移植性,因此可以轻松地移植到各种设备上运行。下面介绍Java实现智能家居控制系统的逻辑过程。
(1)系统架构
在Java中,可以使用多个线程来实现智能家居控制系统的各个模块之间的交互。在每个线程中,可以定义相关的类和方法来处理各个控制器的工作。
例如,可以创建一个名为“CentralProcessor”的类来处理来自各个控制器的信号。在这个类中,可以定义接收信号的方法和发送指令的方法。而对于每个控制器,可以定义一个类,例如“LightController”、“ThermostatController”等来处理相关设备的工作。
(2)通信协议
智能家居控制系统的通信协议需要确保控制器之间的交互操作是正确的。Java中可以使用各种通信协议和技术,如TCP/IP、UDP、MQTT等来实现通信。
例如,可以使用MQTT协议来实现控制器之间的通信。MQTT协议是一种轻量级的发布/订阅消息传递协议,可以支持多个客户端同时连接到同一个服务器上,并且可以实现双向通信。在Java中,可以使用MQTT库来实现MQTT通信协议的处理。
(3)用户界面
智能家居控制系统的用户界面需要提供简单、友好且易于使用的操作方式。Java中可以使用多种技术来开发用户界面,如JavaFX、Swing等。
例如,可以使用JavaFX技术来实现智能家居控制系统的用户界面。JavaFX是Java平台上的一种图形界面库,可以用于创建各种类型的应用程序,包括桌面应用程序、Web应用程序和移动应用程序等。使用JavaFX,可以创建交互式的用户界面,并且可以实现从应用程序向控制器发送指令的功能。
3.总结
Java可以用于实现智能家居控制系统的逻辑过程。在系统设计方面,需要考虑系统架构、通信协议和用户界面等方面。在实现过程中,可以使用Java多线程、通信协议和图形界面库等技术来完成各个模块的实现。随着物联网技术的发展,Java实现智能家居控制系统的应用将会越来越广泛。
以上就是Java实现一个智能家居控制系统的逻辑过程的详细内容,更多请关注php中文网其它相关文章!
Kotlin 学习与实践 (十)Kotlin 的可空性
可空类型
* 类型就是数据的分类。决定了该类型可能的值,以及在该类型值上可以完成的操作。
* 与Java不同,Kotlin对可空类型的显示的支持。可空类型是Kotlin类型系统中帮助避免NullPointException错误的特性。
* 这是一种指出你的程序中那些变量和属性允许为null的方式。
* 可空类型和非可空类型的对象在运行时没有什么区别,可空类型并不是非空类型的包装。所有检查都是在编译时期,所以Kotlin的可空类型并不会在运行时带来额外的开销。
先来看看Java中的空指针是怎么造成的
private int stringLen(String s){
retrun s.length
}
当传入的参数 s 为 null 的时候就会发生空指针异常、。
* 使用Kotlin声明同样的方法不接收可能为null的参数,因为当如果传入可能会null的参数在编译器就会被标记成错误。
* 这样就保证了strLen函数永远不会在运行的时候抛出NullPointException
fun strLen(s: String) = s.length //Kotlin默认s是不可为null的参数如果你传入一个可能为null参数,编译的时候就会报错
如果你想要声明一个接收参数可能为 null 的参数,就需要将这个参数声明为可空类型的参数,而可控类型的参数声明起来也特别简单,只需要咋参数的类型之后加上?
* ?可以加载任意类型的后面来表示这个类型的变量可以存储null引用。如String? Int? MyCustomType?
* Type ? = Type or null
* 没有问号的类型表示这种类型的变量不能存储为null.这说明说有的常见类型都是默认为非空的,除非显示地把它标记为可空的
* 可空类型的变量不能直接调用其方法、不能把它赋值给费空类型的变量、也不能把可空类型的值传递给拥有非空类型的参数的函数。
* 再与null 进行比较之后,编译器就会记住,并且在这次比较发生的作用域内把这个值当错非空来对待
fun nullAbleStrLen(s: String?): Int = if (null != s) s.length else 0
安全调用符
* Kotlin提供了一种非常有用的工具:安全调用运算符"?"
* 它允许你把一次对null的检查和一次方法调用合并成一个操作。例如:s?.toUpperCase() 等同于 if(s!=null) s.toUpperCase() else null
* 如果你试图调用一个非空值的方法,这次方法调用就会被正常执行。但是如果是null 这次调用就不会发生,而整个表达式的值就为null
fun printAllCaps(s: String?) {
//这里要注意 因为后面的表达式返回值可能为空,前面的对象类型声明的时候就要声明成可空类型
val allCaps: String? = s?.toUpperCase()
println(allCaps)
}
* 安全调用不光可以调用方法,也能用来访问属性
* Kotlin 支持多个安全调用链接再一起使用
fun managerName(employee: Employee): String? = employee?.name
class Address(val streetAddress: String, val zipCode: Int, val city: String, val country: String)
class Company(val name: String, val address: Address?)
class Person(val name: String, val company: Company?)
fun Person.countryName(): String {
val country = this.company?.address?.country
return if (null != country) country else "Unknown"
}
Elvis 运算符 “?:”
* Elvis 运算符“?:”
* Kotlin 有方便的运算符来提供null的默认值。它被称作Elvis运算符(或 null合并运算符) -> ?:
*
* Elvis运算符接收两个运算数,如果第一个运算数不为null,运算结果就是第一个运算数,如果第一个运算数为null,运算结果就是第二个运算数
fun foo(s: String?): String {
val t: String = s ?: " "
return t
}
* Elvis运算符经常和安全调用运算符一起使用,用一个值代替对null对象调用方法时返回的null
fun strLenSafe(s: String?): Int = s?.length ?: 0
* 上面获取countryName的方法就可以使用Elvis进一步简化
fun Person.getCountryName(): String = this.company?.address?.country ?: "Unknown"
* Kotlin中 Elvis和return 、 throw 表达式结合再一起使用会更加好使
fun printShippingLabel(person: Person) {
val address = person?.company?.address ?: throw IllegalArgumentException("No address")
with(address) {
println(streetAddress)
println("$zipCode $city $country")
}
}
安全转换 "as?"
* 常规的as运算符和Java中的类型转换一样转换对象的类型,如果被转换的值不是你试图转化的类型,就会抛出ClassCastException。Kotlin提供了一种安全的类型转化操作 as?
* as?运算符尝试把值转换成指定的类型,如果值不是合适的类型就返回null ,经常会和Elvis “?:” 一起使用。
class Person1(val firstName: String, val lastName: String) {
override fun equals(other: Any?): Boolean {
//类型检查如果不匹配就返回false
val otherPersion1 = other as?Person1 ?: return false
//安全检查之后变量会被只能转换为Person1类型
return otherPersion1.firstName == firstName && otherPersion1.lastName == lastName
}
override fun hashCode(): Int {
return firstName.hashCode() * 37 + lastName.hashCode()
}
}
非空断言 “!!”
* 非空断言是Kotlin提供的一种简单直率的处理可空类型值的工具。
* 它使用双叹号表示,可以把任何值转化为非空类型,如果要转换的值是null,则会抛出NullPointException异常
fun ignoreNulls(s: String?) {
val sNotNull: String = s!!
println(sNotNull)
}
//注意当使用!!并且它的结果是异常时,异常调用栈的跟踪信息只会表明异常发生在哪一行,不会表明异常时由那个值引起的,所以尽量避免在一行使用多个非空断言
// person!!.company!!.address!!.name 出现异常的时候不好查找引起的对象
Kotlin 学习快速入门(2)—— 条件 数组 循环 方法
条件
if 条件判断
常用的判断和 Java 一样,这里提一下不同的用法
1.if 可以作为三元运算符
val max = if (a > b) a else b
2. 使用 in 判断是否在某个区间
val x = 1
//相当于条件 1<= x <=8
if(x in 1..8){
println("在区间内")
}
//与上面的条件相反
if(x !in 1..8){
...
}
3.is 关键字类型转换
相当于 Java 中 instanceof
关键字 使用了 is
,kotlin 已经自动完成了类型转换
val text = "hello"
if(text is String){
...
}
when (swich 分支)
1. 字符串分支
val result = ""
when(result){
"OK","SUCCESS" -> print("成功")
"Falied" -> {
一系列操作...
}
else ->{
一系列操作...
}
}
2. 数值分支
val num = 2
when(num){
in 1..10 -> println("num在1和10之间")
11,12 -> println("num为11或12")
}
3. 表达式使用
//hasPrefix方法返回true或fasle
fun hasPrefix(x: Any) = when(x) {
is String -> x.startsWith("prefix")
else -> false
}
4. 不带参数
//里面的分支条件是布尔表达式
when {
x.isOdd() -> print("x is odd")
x.isEven() -> print("x is even")
else -> print("x is funny")
}
数组
kotlin 中数组用 Array 类实现,使用 arrayOf 方法或者是 Array () 的构造方法创建数组
//Int数组 [1,2,3]
val a = arrayOf(1, 2, 3)
//String数组 ["he","you"]
val a = arrayOf("he","you")
//工厂方法,["he0","he1],"he2"]
val array = Array(3, { i -> ("he" + i) })
//还可以传对象
val a = arrayOf(student1,student2)
除了类 Array,还有 ByteArray, ShortArray, IntArray,用来表示各个类型的数组,省去了装箱操作,因此效率更高,其用法同 Array 一样。
循环
while 循环与 java 一样,这里不多说
普通 for 循环
//0-4循环(包括0和4) 打印01234
for(i in 0..4){
println(i)
}
//反序 4-1 两边都包括 打印4321
for (i in 4 downTo 1){
print(i)
}
//[0-4),不包括4 打印0123
for (i in 0 until 4) {
println(i)
}
//结果为13(步长为2,相当于每次循环i=i+2)
for(i in 1..4 step 2){
println(i)
}
数组遍历
//collection数组,list,String等可迭代的对象
for (item in collection){
print(item)
}
//it就是数组中的一个元素
array.forEach {
println(it)
}
//indices是数组的区间(0-length-1)
for (i in array.indices) {
print(array[i])
}
//得到下标和数值
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
方法
无返回值
//Unit相当于Void,可以省略不写
fun sayHello(): Unit{
println("hello world")
}
fun sayHello(){
println("hello world")
}
带返回值
fun sayHello(): String{
return "hello world"
}
//如果方法是作为表达式,则可以省略声明方法返回的类型
fun sayHello() = "hello"
// public方法则必须明确写出返回类型
public fun sum(a: Int, b: Int): Int = a + b
带参数
fun max(num1: Int, num2: Int): Int {
return if (num1>num2) num1 else num2
}
可变参数
可变参数使用 vararg 关键字修饰
fun vars(vararg v:Int){
for(vt in v){
print(vt)
}
}
原文出处:https://www.cnblogs.com/stars-one/p/11251441.html
我们今天的关于入门级带你实现一个安卓智能家居APP和2kotlin版本的分享已经告一段落,感谢您的关注,如果您想了解更多关于Eyepetizer-in-Kotlin:一款简约的小视频app,带你走进kotlin、Java实现一个智能家居控制系统的逻辑过程、Kotlin 学习与实践 (十)Kotlin 的可空性、Kotlin 学习快速入门(2)—— 条件 数组 循环 方法的相关信息,请在本站查询。
本文标签: