Android框架Anko 的初次尝试,你需要知道的步骤
来源:互联网 发布:原味内衣淘宝怎么搜 编辑:程序博客网 时间:2024/06/05 07:09
环境参数:
Android Studio版本:2.3.3
kotlin版本:1.1.4-2
anko版本:0.10.0
前言
此次的实例程序的功能是执行简单的登录操作,需要进行网络访问,最终的效果大致是这样的:
第一步:
目前版本的Android Studio 是不能直接创建Kotlin工程的(3.0预览版除外)。我们可以通过安装Kotlin的插件,提供对kotlin的支持。
这个kotlin插件,提供了将Java的Android项目配置成Kotlin版的android项目的功能
它在配置文件中只添加 ‘kotlin-android’ 这个plugin。
如果你想直接使用xml文件中的视图ID,你还需要添加 ‘kotlin-android-extensions’。直接使用视图ID是什么意思呢?
也就是,你可以通过视图的ID直接对视图进行操作,省去了findViewById的烦恼。
第二步:
要想使用Anko的Layout模块,你需要引入一下几个依赖:
compile "org.jetbrains.anko:anko-appcompat-v7:$anko_version"compile "org.jetbrains.anko:anko-sdk25:$anko_version"compile "org.jetbrains.anko:anko-sdk25-coroutines:$anko_version"compile "org.jetbrains.anko:anko-appcompat-v7-coroutines:$anko_version"
按照,anko的说法,在类似按钮的onClick事件中是可以直接使用协程上下文的,也就是所你可以在里面借助协程进行一些耗时操作(网络请求、操作数据等等)。
可是,android项目默认是不启动协程的,你要想使用协程,需要在build.gradle里面添加相应的配置,当然你也可以在使用到协程的地方,使用快捷键 Alt+Enter 或 Option+Enter,便会出现一下画面
选择第二项,开启当前模块对协程的支持。之后在配置文件中就回多处一下一些东西:
第三步:
写布局,一开始是想直接使用anko的DSL来写布局的,anko介绍说有插件可以对DSL进行预览,这样子的确是比xml写布局要好一些(参考文章Android框架Anko:Anko布局有什么好)。可是,该插件只支持android studio 2.4以上版本是什么鬼。我这android studio的版本才2.3.3。一开始,我还怀疑是我太就没有更新了,于是赶紧去了一趟Android Studio的官网。看到确是以下的画面:
** ,官网上提供的android studio也只到2.3.3版本啊!!。这个插件是开发出来给谁用的。(不知道windows上的android studio到那个版本了)。于是我不顾它的版本建议,强行安装了一波。结果。。。android studio直接死掉了。
哎,放弃了,还是乖乖用xml写布局吧。等3.0出正式版的时候在用吧。
不过,layout模块中的一些扩展还是可以用用的:
btn_login.onClick {...... }
第四步:
这个小程序执行登录操作,是一个耗时操作,是无法在主线程上进行的。之前也说了anko的onClick这一类的监听器中是可以直接写协程的,那么实际究竟应该怎么写呢?
btn_login.onClick { val data: Deferred<Response<User>?> = async(CommonPool){ login(User(email = et_email.text.toString(),password = MD5Util.md5(et_pwd.text.toString()))) } toast(data.await()!!.req.msg)}
其中的login函数是这样的:
suspend fun login(user:User): Response<User>?{ return try { val client = OkHttpClient() val request = Request.Builder().url("http://www.feintkotlin.com:8686/user/sign-in"). post(RequestBody.create(MediaType.parse("application/json"), ObjectMapper().writeValueAsBytes(user))).build() val response = client.newCall(request).execute() ObjectMapper().readValue(response.body()!!.string(), Response<User>(data = User())::class.java) }catch (e:Exception){ logger.info(e.toString()) Response<User>(User(),Response.NOT_FOUND) } }
在这里面进行了网络操作。
或者,我们可以使使用anko提供的一个帮助方法 bg
btn_login.onClick { val data: Deferred<Response<User>?> =bg{ login(User(email = et_email.text.toString(),password = MD5Util.md5(et_pwd.text.toString()))) }}
使用这个需要引入以下依赖:
compile “org.jetbrains.anko:anko-coroutines:$anko_version”
bg的源码是这样的:
package org.jetbrains.anko.coroutines.experimentalimport kotlinx.coroutines.experimental.*@PublishedApiinternal var POOL = newFixedThreadPoolContext(2 * Runtime.getRuntime().availableProcessors(), "bg")inline fun <T> bg(crossinline block: () -> T): Deferred<T> = async(POOL) { block()}
注意:我们可以看出在bg中是不能使用挂起函数的(挂起函数只能在协程上下文或其他的挂起函数中使用,而block是一个普通函数),因此我们需要去掉login函数的suspend关键字
完整代码:FeintKotlin的Github
更多kotlin的内容,欢迎关注Kotlin学习网
- Android框架Anko 的初次尝试,你需要知道的步骤
- Kotlin+Anko 你应该尝试的新Android开发方式
- git 初次接触需要知道的代码
- android sqlite 初次尝试遇到的坑
- 成为UX设计师:你需要知道的六个基本步骤
- Android Glide你需要知道的内容
- Android中你需要知道的(一)
- 你需要知道的Android上下文Context
- Android-关于传感器你需要知道的
- MyCat的初次尝试
- 你需要尝试的25个Android第三方库
- 你需要知道的其它重要的框架
- 你需要知道的git
- 关于信号量的初次尝试
- Storm IScheduler的初次尝试
- sublime text3 的初次尝试
- vue.js的初次尝试
- sea.js的初次尝试
- 解决存储过程执行快,但程序调用则执行慢的问题
- 剑指Offer-61
- 学习Dubbo(一)
- 【频繁项集挖掘】FP-growth算法原理
- thinkphp3.2.3之集成极光推送
- Android框架Anko 的初次尝试,你需要知道的步骤
- Python挑战游戏( PythonChallenge)闯关之路Level- 6
- 欢迎使用CSDN-markdown编辑器
- Android instrumented test no tests found
- C语言实现循环输入
- C++ STL中有两种find
- java子类父类静态代码块 构造代码块 构造函数执行顺序
- github多个账号ssh-key的问题
- 【专题】树的最小支配集 最小点覆盖 最大独立集