用kotlin方式打开《第一行代码:Android》
参考:《第一行代码:Android》第2版——郭霖
注1:本文为原创,例子可参考郭前辈著作:《第一行代码:Android》
注2:本文不赘述android开发的基本理论,不介绍入门知识,不介绍Android Studio基本安装,开门见山,直接使用kotlin改写郭前辈的《第一行代码:Android》中的部分例子,有机会的话自己做一些新例子出来!
注3:本文基本以kotlin语言作为Android开发,偶尔涉及java作为对比
注4:开发基于Android Studio 3.0,并且新建项目时勾选“support kotlin”
看看精彩世界——使用网络技术
原书9.2节:看看精彩世界——使用网络技术(书p312)
原书采用了OkHttp开源项目作为请求类库
我改为使用kotlin对Java.Net类扩展的URL类!
一些小知识:
kotlin是基于JVM的语言,他不像scala语言,重新构建了自己的生态,kotlin直接扩展了java的类库,他的宗旨:“java有则用之,无则扩展之”,所以他能做到与java的100%兼容,这个优势同样被一起带入了他的Android开发邻域
(注:kotlin已成为了Google官推语言)
Anko类库:
anko类库不是kotlin自带的标准库,需要在gradle中添加扩展,gradle会自动下载anko和处理他的依赖
官网对anko的描述(也许你暂时不感兴趣,可以跳过):https://github.com/Kotlin/anko
寻找anko:
上这个网址,搜索anko即可
http://mvnrepository.com/search?q=anko
点击如图箭头里的包:
需要用到的是上图中的其中三个,anko-sdk可以选择23或者15,我选择的是15。
另外两个,一个个点进去,选择gradle,复制里面的代码:
复制到这里:
并且自己改成成android gradle的格式,什么是android的格式?
参考这个文件原有的gradle dependencies写法即可,注意去掉结尾的beta!
build.gradle(Module:app):
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
testCompile 'junit:junit:4.12'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
compile 'com.squareup.okhttp3:okhttp:3.8.0'
compile 'org.jetbrains.anko:anko-sdk15:0.9'
compile 'org.jetbrains.anko:anko-support-v4:0.9'
compile 'org.jetbrains.anko:anko-appcompat-v7:0.9'
}
点击sync gradle,把类库同步到本地
记得要配置Manifest.xml提供网络访问的权限!
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.cslg.networktest">
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
......
</application>
........
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
布局
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="cn.cslg.networktest.MainActivity">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="http://guolin.tech/api/china/16/116"
/>
<Button
android:id="@+id/get"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获取网络数据" />
<ImageView
android:id="@+id/img"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ScrollView
android:id="@+id/scroll"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="从url获得的数据"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</ScrollView>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
布局文件提供了一个EditText,一个TextView,一个Button,一个ImageView,一个ScrollView
EditText:用户可以输入任何可以返回字符串或者文件字节的网址
Button:点击后开始请求
TextView:显示返回的字符串
ImageView:显示网址的图片文件
ScrollView:提供给TextView用,有可能字符串过长溢出,这个控件可以显示为滚动的文本
kotlin
MainActivity.kt:
package cn.cslg.networktest
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.ImageView
import android.widget.TextView
import org.jetbrains.anko.*
import org.jetbrains.anko.custom.async
import java.net.URL
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val text = find<TextView>(R.id.text)
val Btn = find<Button>(R.id.get)
val url = find<EditText>(R.id.url)
val img = find<ImageView>(R.id.img)
Btn.onClick({
val url = url.text.toString()
async {
val byteArrayIn = URL(url).readBytes()
var s = String(byteArrayIn)
uiThread { text.setText(s) }
}
})
}
}
分析:
可以看到上述代码引入了anko包,这使得kotlin对布局的获取和操作更加的简单直观
使用 find的形式直接获得xml布局中的元素,但仍然使用R.id的形式找到相应id的布局元素
使用 var(可变)或者val(不可变)来声明并且直接获得对象的引用,kotlin编译器将会自动推断变量类型!
这些find,onClick方法都是anko包提供的
是不是比findViewById和那个xxxListener简单很多
kotlin还可以用lambada表达式替代原来java看着冗长的匿名类(闭包)
事实上,这里是直接向onClick传入了一个fun,即函数对象!它将在onClick触发后去执行
接下来是真正对网络世界的请求:
URL类是kotlin对java.net库的扩展,用于网络请求,构造方法将会生成一个URL对象,里面有俩方法:
参考:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.net.-u-r-l/
使用URL.readText可以直接获取网站返回的字符串String,一般用于json的获取
使用URL.readBytes可以将网站返回的内容按字节ByteArray获取,可用于图片,文件的获取
上述使用了Bytes是为了后面获得一张在线图片准备,如果想直接获得json字符串的话,使用readText:
async {
val s = URL(url).readText()
uiThread { text.setText(s) }
}
效果
输入网址,获得相应数据,此例获得json
获取文件
上面实现的是获取String,那么获取文件呢
以图片文件为例,直接显示在ImageView控件当中
修改async下的代码即可
async {
val data = URL(url).readBytes()
if (data != null) {
uiThread {
val bitmap = BitmapFactory.decodeByteArray(data, 0, data.size)// bitmap
imageView.setImageBitmap(bitmap)
toast("success")
}
} else {
toast("image error")
}
}
分析:
这次为了获得文件,必须使用readBytes方法,他会传回一个ByteArray(字节数组)
然后使用BitmapFactory下的decodeByteArray方法将ByteArray转换为图片
效果
试着在EditText输入图片的地址:
转载请注明出自:http://www.cnblogs.com/devilyouwei/p/6881955.html
用kotlin方式打开《第一行代码:Android》的更多相关文章
- 20172327 2018-2019-1 《第一行代码Android》第二章学习总结
学号 2017-2018-2 <第一行代码Android>第二章学习总结 教材学习内容总结 - 活动是什么: 活动(Activity)是最容易吸引用户的地方,它是一种可以包含用户界面的组件 ...
- 20172327 2018-2019-1 《第一行代码Android》第一章学习总结
学号 2018-2019-1 <第一行代码Android>第一章学习总结 教材学习内容总结 - Android系统架构: 1.Linux内核层 Android系统是基于Linux内核的,这 ...
- 《第一行代码——Android》
<第一行代码——Android> 基本信息 作者: 郭霖 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115362865 上架时间:2014-7-14 出版日期:2014 ...
- 晒订单赢图灵图书,《第一行代码——Android》福利活动劲爆来袭!
版权声明:本文出自郭霖的博客,转载必须注明出处. https://blog.csdn.net/sinyu890807/article/details/28863515 (已结束) 我的著作<第一 ...
- 第一行代码Android(第3版).pdf下载
2020年人民邮电出版社出版的图书 <第一行代码Android(第3版)>是2020年4月人民邮电出版社出版的图书,作者是郭霖. 封面: 内容简介: <第一行代码 Android 第 ...
- 历时一年,我的著作《第一行代码——Android》已出版!
前言 事实上我当初决定開始写博客的想法挺简单的,认为自己搞技术这么多年了,总应该要留下点什么.既然没能写出什么出色的应用,那至少也要留下点文字分享给大家,以指引在我后面的开发人员们,毕竟我也从前辈们的 ...
- 第一行代码 Android 思维导图
第一行代码 Android 思维导图
- Kotlin实现《第一行代码》案例“酷欧天气”
看过<第一行代码>的朋友应该知道“酷欧天气”,作者郭神用整整一章的内容来讲述其从无到有的过程. 最近正好看完该书的第二版(也有人称“第二行代码”),尝试着将项目中的Java代码用Kotli ...
- 第一行代码 Android 第二版到货啦
今日android第一行代码[第二版]已到,收获的季节到了 先看一下封面 书签: 以后就把空闲时间送给它吧 先来看一下本书的目录: 第1章 开始启程--你的第1行Android代码 第2章 先从看得到 ...
- 第一行代码 Android (郭霖 著)
https://github.com/guolindev/booksource 第1章 开始启程----你的第一行Android代码 (已看) 第2章 先从看得到的入手----探究活动 (已看) 第3 ...
随机推荐
- [SinGuLaRiTy] 最短路计算代码库
[SinGuLaRiTy-1002] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. Dijkstra: 题目描述 有向图的单源点最短路问题( ...
- Python之路-字符编码&数据类型补充
作业 三级菜单程序 menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{ }, '网易':{ }, 'google':{ } }, '中关村':{ '爱奇艺':{}, '汽车 ...
- 5.Redis常用命令:Hash
我们可以将Redis中的Hashes类型看成具有String Key和String Value的map容器.所以该类型非常适合于存储值对象的信息.如Username.Password和Age等.如果H ...
- 基于Excel参数化你的Selenium2测试代码
- 在 redhat 6.4上安装Python 2.7.5
在工作环境中使用的是python 2.7.*,但是CentOS 6.4中默认使用的python版本是2.6.6,故需要升级版本. 安装步骤如下: 1,先安装GCC,用如下命令yum install g ...
- 【学而思】利用shouldComponentUpdate钩子函数优化react性能以及引入immutable库的必要性
凡是参阅过react官方英文文档的童鞋大体上都能知道对于一个组件来说,其state的改变(调用this.setState()方法)以及从父组件接受的props发生变化时,会导致组件重渲染,正所谓&qu ...
- 用ElasticSearch搭建自己的搜索和分析引擎
作者:robben,腾讯高级工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 导语:互联网产品中的检索功能随处可见.当你的项目规模是百度大搜|商搜或者微信公众号搜索这种体量的时候 ...
- mui 页面间传值得2种方式
通过最近得工作开发刚接触mui框架,用到了页面间得传值, 第一种:通过url进行传值 父页面代码: mui.openWindow({ id:'子页面.html', url:'子页面.html?para ...
- 【Tomcat源码学习】-1.概述
Tomcat是用java语言开发的一个Web服务器,最近花了差不多两周时间对Tomcat 9.0源码进行了一遍学习,由于知识储备有限,也只是理解了一个大概,下面就由我来给大家分享一下我对Tomcat的 ...
- 【转】JDBC学习笔记(3)——复习和练习
转自:http://www.cnblogs.com/ysw-go/ 复习部分 一.获取数据库连接 1)方式一 1 // 获取数据库连接 2 @Test 3 public void testGetCon ...