对一个KotlinAPP的copy
来源:互联网 发布:免费费用报销软件 编辑:程序博客网 时间:2024/05/19 11:46
最近看了下Kotlin。随便找了个简单的地址就开始了copy。真的是copy,代码结构,布局,图片等都是copy的。
本文地址: http://blog.csdn.net/qq_25806863/article/details/73209612
主要是为了体验一下Kotlin在Android开发中是什么样子的。
copy对象就是几百个Gank的其中一个:https://github.com/onlyloveyd/GankIOWithKotlin
也可以他博客看一下 http://blog.csdn.net/poorkick/article/details/72510645
非常感谢大神的分享,copy的结果就是:https://github.com/wangyisll/gankapplication/tree/master
图什么就不放了,跟原来那个一样,就是颜色变了一下
因为使用了Kotlin Android Extensions,所以我觉得没必要再用ButterKnife了,所以就删掉了。
哈哈,下面记录一下copy中感受到的不同,都只是一部分示例,更多的可以看代码进行比较。
这是大神的java版 https://github.com/onlyloveyd/GankIOClient
这是大神的kotlin版 https://github.com/onlyloveyd/GankIOWithKotlin
具体语法还是看官方语法文档吧。
1.Kotlin Android Extensions
这是Kotlin官方的扩展,可以省去finViewById
如在activity_main.xml
中有这样的布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v7.widget.Toolbar android:id="@+id/toolBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/colorPrimary" android:fitsSystemWindows="true" android:titleTextColor="@color/white"/></LinearLayout>
上面的id为toolBar
,所以在代码中可以直接使用id来表示这个空间,跟ButterKnife一样。
先引入:
import kotlinx.android.synthetic.main.activity_main.*
然后就能直接在代码中使用了:
setSupportActionBar(toolBar)
2.对属性的引用
在Kotlin中,控件的大部分get和set的属性都能直接向下面这样用:
tvTitle.setText("a") //写成 tvTitle.text = "a"
3.单例
在原来的额网络请求类单例是这样的:
public class HttpMethods { public static final String BASE_URL = "http://gank.io/api/"; private static final int DEFAULT_TIMEOUT = 5; private Retrofit retrofit; private ContentService contentService; private OkHttpClient mOkHttpClient; //构造方法私有 private HttpMethods() { //手动创建一个OkHttpClient并设置超时时间 OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder(); httpClientBuilder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS); mOkHttpClient = httpClientBuilder.build(); retrofit = new Retrofit.Builder().client(mOkHttpClient) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .baseUrl(BASE_URL) .build(); contentService = retrofit.create(ContentService.class); } //获取单例 public static HttpMethods getInstance() { return SingletonHolder.INSTANCE; } /** * 用于获取干货数据 * * @param subscriber 由调用者传过来的观察者对象 * @param category 类别 * @param pagesize 请求数据个数 * @param pagenum 页码 */ public void getData(Observer<DataBean> subscriber, String category, String pagesize, int pagenum) { contentService.getContent(category, pagesize, pagenum) .subscribeOn(Schedulers.io()) .unsubscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(subscriber); 。。。 //在访问HttpMethods时创建单例 private static class SingletonHolder { private static final HttpMethods INSTANCE = new HttpMethods(); }}
在Kotlin中,单例直接这样写:
object RetrofitClient { private val retrofit: Retrofit private val api: RetrofitApiService private val baseUrl = "http://gank.io/api/" init { val httpclient = OkHttpClient.Builder() httpclient.connectTimeout(10, TimeUnit.SECONDS) retrofit = Retrofit.Builder().client(httpclient.build()) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .baseUrl(baseUrl) .build() api = retrofit.create(RetrofitApiService::class.java) } /** * 获取干货数据 */ fun getData(subscriber: Observer<TypeData>, category: String, pageSize: String, pageNum: Int) { api.getContent(category, pageSize, pageNum) .subscribeOn(Schedulers.io()) .unsubscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .safeSubscribe(subscriber) }}
class变成了object,然后下面这样使用就是单例的,那些方法就跟变成了static一样,直接调用:
RetrofitClient.getData(...)
4.常量类的定义
java中的常量类一般是这样的:
public class Constant { public static final long ONE_SECOND = 1000; public static final long ONE_MINUTE = ONE_SECOND * 60; public static final long ONE_HOUR = ONE_MINUTE * 60; public static final long ONE_DAY = ONE_HOUR * 24;}
在Kotlin中可以写成这样:
object Constant { val ONE_SECOND: Long = 1000 val ONE_MINUTE = ONE_SECOND * 60 val ONE_HOUR = ONE_MINUTE * 60 val ONE_DAY = ONE_HOUR * 24}
使用起来都是一样的 Constant.ONE_SECOND
,但是省掉了好多public static final
5.集合的定义
java中集合的初始化是这样的:
public static HashMap<String, Integer> sTypeColor = new HashMap<String, Integer>() { { put("Android", R.drawable.bg_android_tag); put("iOS", R.drawable.bg_ios_tag); put("瞎推荐", R.drawable.bg_rec_tag); put("拓展资源", R.drawable.bg_res_tag); put("App", R.drawable.bg_app_tag); put("福利", R.drawable.bg_bonus_tag); put("前端", R.drawable.bg_js_tag); put("休息视频", R.drawable.bg_video_tag); } }; public static ArrayList<String> sCategoryList = new ArrayList<String>() { { add("all"); add("Android"); add("瞎推荐"); add("iOS"); add("前端"); add("拓展资源"); add("App"); add("休息视频"); add("福利"); } };
在Kotlin中也可以写成类似的:
var sTypeColor: HashMap<String, Int> = object : HashMap<String, Int>() { init { put("Android", R.drawable.bg_android_tag) put("iOS", R.drawable.bg_ios_tag) put("瞎推荐", R.drawable.bg_rec_tag) put("拓展资源", R.drawable.bg_res_tag) put("App", R.drawable.bg_app_tag) put("福利", R.drawable.bg_bonus_tag) put("前端", R.drawable.bg_js_tag) put("休息视频", R.drawable.bg_video_tag) } } var sCategoryList: ArrayList<String> = object : ArrayList<String>() { init { add("all") add("Android") add("瞎推荐") add("iOS") add("前端") add("拓展资源") add("App") add("休息视频") add("福利") } }
更可以写成下面的简单的:
var sTypeColor = mutableMapOf("Android" to R.drawable.bg_android_tag, "iOS" to R.drawable.bg_ios_tag, "瞎推荐" to R.drawable.bg_rec_tag, "拓展资源" to R.drawable.bg_res_tag, "App" to R.drawable.bg_app_tag, "福利" to R.drawable.bg_bonus_tag, "前端" to R.drawable.bg_js_tag, "休息视频" to R.drawable.bg_video_tag) var sCategoryList = mutableListOf("all", "Android", "瞎推荐", "iOS", "前端", "拓展资源", "App", "休息视频", "福利")
又省了好多代码….
6.anko的startActivity
启动一个Activity是很常用的,通过anko可以快速启动一个Activity:
先导入,一般都是自动引用
import org.jetbrains.anko.startActivity
然后使用:
startActivity<OrderActivity>()
也可以带参数:
startActivity<WebActivity>("URL" to data.url)//在WebActivity中接收参数,下面的intent其实就是getIntent(),extras其实就是getExtras()intent.extras.getString("URL")
7.分支语句
Kotlin中用when代替了switch
用法也是类似的:
override fun onOptionsItemSelected(item: MenuItem?): Boolean { when(item?.itemId){ R.id.refresh -> wv.reload() R.id.share -> url?.let { share(it) } R.id.openinbrowse -> url?.let { browse(it) } R.id.copyurl -> { val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager clipboard.text = url Snackbar.make(wv,"已复制到剪切板",Snackbar.LENGTH_SHORT).show() } } return super.onOptionsItemSelected(item) }
而且还能直接作为返回值:
override fun getItem(position: Int): Fragment? { return when (position) { 0 -> DailyFragment.getInstance() 1 -> SortFragment.getInstance() 2 -> MindFragment.getInstance() else -> AboutFragment.getInstance() }}
8. let的使用和空判断
经常会有这样的需求:
if (dailyBean.getResults().getAndroid() != null) { mVisitableList.addAll(dailyBean.getResults().getAndroid()); }
判断一个东西不为空,然后执行一段代码。一行可能看不出来,下面这样呢?
@Override public void onNext(DailyBean dailyBean) { 。。。 if (dailyBean.getResults().getAndroid() != null) { mVisitableList.addAll(dailyBean.getResults().getAndroid()); } if (dailyBean.getResults().getApp() != null) { mVisitableList.addAll(dailyBean.getResults().getApp()); } if (dailyBean.getResults().getBonus() != null) { mVisitableList.addAll(dailyBean.getResults().getBonus()); } if (dailyBean.getResults().getIOS() != null) { mVisitableList.addAll(dailyBean.getResults().getIOS()); } if (dailyBean.getResults().getJs() != null) { mVisitableList.addAll(dailyBean.getResults().getJs()); } if (dailyBean.getResults().getRec() != null) { mVisitableList.addAll(dailyBean.getResults().getRec()); } if (dailyBean.getResults().getRes() != null) { mVisitableList.addAll(dailyBean.getResults().getRes()); } if (dailyBean.getResults().getVideo() != null) { mVisitableList.addAll(dailyBean.getResults().getVideo()); } 。。。 }
如果用let,会少很多,作用是一样的:
override fun onNext(dailyData: DailyData) { ... dailyData.results.android?.let { mVisitableList.addAll(it) } dailyData.results.app?.let { mVisitableList.addAll(it) } dailyData.results.bonus?.let { mVisitableList.addAll(it) } dailyData.results.ios?.let { mVisitableList.addAll(it) } dailyData.results.js?.let { mVisitableList.addAll(it) } dailyData.results.rec?.let { mVisitableList.addAll(it) } dailyData.results.res?.let { mVisitableList.addAll(it) } dailyData.results.video?.let { mVisitableList.addAll(it) } ... }
- 对一个KotlinAPP的copy
- copy一个数组的方法
- 一个Marshal.Copy的问题
- copy属性的一个好处
- 对Block用copy修饰的理解
- strong和copy对NSString的影响
- Mac OS ssh-copy-id Command not found 导致无法对目标服务器上传一个公钥的问题解决方案
- copy命令的一个巧妙运用
- copy 一个给年轻人的30忠告
- Copy-on-Write 一个很好的例子
- error MSB3073 copy错误的一个解决办法
- error MSB3073 copy错误的一个解决办法
- .NET对目录文件的Copy和Move的操作
- 巧用Bulk Copy将大量的数据复制到数据库(对同一个数据的表或不同一个数据库的表都行)
- 用java对被锁文件进行copy的解决方法
- 对不同类型assgin,retain,和copy内部实现的方法
- COPY 服务器端的错误和对常用软件进行测试
- iOS中对copy与mutableCopy的理解
- 第1章--说说数据结构的基本概念
- Centos6.5网络配置以及设置win7禁止ping入
- 手机自适应弹窗
- ExpandableListView的使用,Group和Child的类文件写法
- TeamViewer
- 对一个KotlinAPP的copy
- java教程及中文手册
- 1、Node.js => 安装配置
- IP字节顺序与IP格式
- app音量调节
- AUC指标
- JAVA Finalizable对象为啥会爆内存溢出
- 如何选择优化器 optimizer
- 《算法导论》第22章 基本的图算法 个人笔记