告别Java。一起来使用kotlin开发完整客户端

VJYTam 8年前
   <h2><strong>必须写在前面:从Java转向Kotlin,只需要几天时间!</strong></h2>    <p>本篇是kotlin开发Android系列教程的最后一篇。前面几篇介绍了kotlin的基本语法、与java的不同之处等。在本篇文章中,将使用到前面的知识点,从零开发一款Gank.io 干活集中营App(感谢Gank提供的Api)。 该App完全使用了Kotlin语言开发,基于MVP模式,并使用如下主流开源框架:</p>    <ul>     <li><a href="/misc/goto?guid=4958868691958644224" rel="nofollow,noindex">Kotlin</a></li>     <li><a href="/misc/goto?guid=4958864078712375065" rel="nofollow,noindex">Dagger2</a></li>     <li><a href="/misc/goto?guid=4958865750209621132" rel="nofollow,noindex">Rxjava</a></li>     <li>DataBinding</li>     <li><a href="/misc/goto?guid=4958964956869128717" rel="nofollow,noindex">Retrofit</a></li>     <li><a href="/misc/goto?guid=4958964956476581901" rel="nofollow,noindex">Okhttp3</a></li>     <li><a href="/misc/goto?guid=4958961145273295585" rel="nofollow,noindex">DeepLinkDispatch</a></li>     <li><a href="/misc/goto?guid=4958964956010997959" rel="nofollow,noindex">Gson</a></li>     <li><a href="/misc/goto?guid=4958862736295244246" rel="nofollow,noindex">Glide</a></li>    </ul>    <p>除了以上主流库,还运用到了我的一个导航栏滑动隐藏库:</p>    <ul>     <li> <p>ByeBurger</p> <p>界面风格采用了MD风格,多数控件都是design包里的内容。主要实现了一个客户端该有的内容,界面交互,信息展示,数据获取等等。</p> </li>    </ul>    <p style="text-align:center"><img src="https://simg.open-open.com/show/e02f76e61fc479b50c6c5abd0dc46d41.png"> <img src="https://simg.open-open.com/show/5d47a58c994bdd9a7adf90b8f50c733c.png"></p>    <p>笔者已经将Kotlin运用在项目开发2个月了,期间难免有一些坑,但是在坑之外,是他带给我的 <strong>快感</strong> ,从此以后。用Kotlin写代码相较于Java完全是一种享受。鉴于有些同学没有看前面的文章,这里再简单介绍一下Kotlin。</p>    <p>Kotlin是又一个基于JVM的语言,由JetBrains开发(你用的Android Studio就是他家的)。 如果你有java基础,那么他上手极其容易。</p>    <p>除了无缝调用java(所有java类、java库皆可不作任何处理的兼容)、一键将java转为Kotlin、空指针安全这些特性,还有许多比Java屌的特性。下面举一些栗子:</p>    <p>1.代码量对比:</p>    <p><strong>Java</strong></p>    <pre>  <code class="language-kotlin">TextView textView = findViewById(R.id.textView);    textView.setText("Hello World");</code></pre>    <p><strong>Kotlin</strong></p>    <pre>  <code class="language-kotlin">textView.text = "hello kotlin"</code></pre>    <p>扩展函数简单来说,就是将某个类不通过继承动态扩展,来添加方法等,比如下面的toast就是扩展了Context类。</p>    <p><strong>Java</strong></p>    <pre>  <code class="language-kotlin">Button button = findviewbyid(R.id.button)  button.setOnClickListener(new View.OnClickListener() {  @Override public void onClick(View v) {  Toast.makeText(this,"hello java",Toast.LENGTH_SHORT);  }  });</code></pre>    <p><strong>Kotlin</strong></p>    <pre>  <code class="language-kotlin">button.setOnClickListener {toast("hello kotlin")}</code></pre>    <p>POJO类(Java Bean对比)</p>    <p><strong>java</strong></p>    <pre>  <code class="language-kotlin">public class User {  private String name;  private String id;    public User(String name, String id) {  this.name = name;  this.id = id;  }    public String getName() {  return name;  }    public void setName(String name) {  this.name = name;  }    public String getId() {  return id;  }    public void setId(String id) {  this.id = id;  }    }</code></pre>    <p>kotlin(不要被吓到,确实这么短!!)</p>    <pre>  <code class="language-kotlin">data class User(var name: String, var id: String)</code></pre>    <h2><strong>栗子完毕</strong></h2>    <p>相信看到上面的一些代码对比,大家心里已经比较清楚kotlin的特点了。相比java,代码少了至少三倍。这简直是大快人心!</p>    <h2><strong>开发完整App客户端</strong></h2>    <p>现在,假定你已经了解了Kotlin的基本用法,那么我将给你介绍这个客户端App的结构。</p>    <h2><strong>MVP</strong></h2>    <p>通过契约类Contract管理View Model Presenter接口(如果你项目写烦了MVP,那么安利下自动生成MVP代码的插件 <a href="/misc/goto?guid=4959722059157716651" rel="nofollow,noindex">MVPHelper</a> )。</p>    <ul>     <li>Model — 主要处理业务,用于数据的获取(如网络、本地缓存)。</li>     <li>View — 用于把数据展示,并且提供交互。</li>     <li>Presenter — View和Model交互的桥梁,二者通过Presenter建立联系。</li>    </ul>    <p>主要流程如下: 用户与View交互,View得知用户需要加载数据,告知Presenter,Presenter则告知Model,Model拿到数据反交于Prsenter,Presenter将数据交给View进行展示。</p>    <p>偷一张老图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/8eaa3978f4b708390dd118f58e880a0c.png"></p>    <h2><strong>Dagger2</strong></h2>    <p>项目中,主要进行presenter、model、retrofit Api等类的注入操作。这里不做详细Dagger2用法解释,还不太会的同学可以先去拜读下大神的教程。Dagger2在Kotlin中使用有一些配置是不一样的,详细配置请看 <strong>项目源码</strong> 。</p>    <p>ApiComponent</p>    <p>主Component、用于注入AppComponent、便于提供子Component依赖。</p>    <p>依赖于:</p>    <p>1.ApiModule(提供okhttpClient、Retrofit、Api等)</p>    <p>2.AppModule(提供context对象(okhttp拦截器所需))</p>    <p>FuckGoodsComponent</p>    <p>父Component为ApiComponent 用于注入FuckGoodsPresenter</p>    <p>依赖于: FuckGoodsModule(提供FuckGoodsView)</p>    <p>RandomComponent</p>    <p>父Component为ApiComponent 用于注入RandomPresenter</p>    <p>依赖于 : RandomModule(提供RandomView)</p>    <h2><strong>Rxjava + Retrofit + okhttp3</strong></h2>    <p>主要用于网络访问。这些都是主流的库,使用方式与java相同(当然除了语法以外)</p>    <h2><strong>DeepLinkDispatch</strong></h2>    <p>基于路由进行页面转发。可以解决多人多模块协作转跳的问题。</p>    <p>GankClientUri定义一些路由规则、URI等</p>    <p>GankRouter统一由此进行路由操作</p>    <h2><strong>GSON</strong></h2>    <p>用于json的解析操作。</p>    <h2><strong>Glide</strong></h2>    <p>用于图片的加载。</p>    <h2><strong>ByeBurGer</strong></h2>    <p>用于导航栏以及悬浮按钮滑动隐藏。</p>    <p>开源本客户端的原因旨在让更多人了解Kotlin,接触Kotlin,从而使用Kotlin,实在是好东西不敢私藏。并且希望通过Kotlin能认识更多志同道合的朋友们,一起讨论技术共同进步。</p>    <p> </p>    <p> </p>