Kotlin 實踐

douzifly發表於2015-07-08

Kotlin,其語法來自: Swift, C#, Go?

優點:

  • 非常簡潔的語法,程式碼量銳減,老闆要扣薪水了!
  • 與Java程式碼互動非常容易和簡單
  • 更好的泛型
  • 安全的null運算, 跟Swift的一樣
  • 更好的Lambda支援
  • 方法(函式)為一級公民
  • 擴充套件方法
  • inline
  • 還有一系列的語法糖: range, data class 等

以下是我在專案中的一些實踐:

1, 對String進行擴充套件方法後,網路請求變成了這樣

// 非同步搜尋App
fun searchApps(callback: (AppInfo?) -> Unit) {
    var url = "http://www.xxxx.com/app/"
    url.addHeader("user-agent", "kotlin")
            .addQueryString("q", "GooglePlay")
            .httpGet {
                resp ->
                var app = resp.content?.toJson(javaClass<AppInfo>())
                callback(app)
            }
}

非同步請求應用資訊,並轉換為AppInfo物件
網路請求封裝了AsyncHttpClient/async-http-client · GitHub, Json轉換封裝了 alibaba/fastjson · GitHub (為了簡約起見,忽略了其他邏輯,下同)

2, 為 Activity 和 Fragment 增加了非同步操作擴充套件

class MainActivity : Activity() {
    fun asyncSample() {
        async({
            // 這裡的程式碼執行在 *執行緒池* 中
            // 返回值自動傳入下一個引數
            verySlowMethod()
         }) {

            // 讀取上一個引數的值
            // 並且在 *主執行緒* toast出來
            str->
            str.toast(this)
        }
    }
}

fun verySlowMethod(): String {
    Thread.sleep(2000)
    return "kotlin"
}

// async 函式定義
fun async<T>(background: ()-> T, foreground:(T) -> Unit) {
    checkPool()
    pool?.submit() {
        val t:T = background()
        runOnUIThread {
            foreground(t)
        }
    }
}

// 為Activity增加擴充套件
inline fun Context.async<T>(noinline b:() -> T, @noinline f:(T) -> Unit) = ThreadExt.async(b, f)

{% endhighlight %}

也可以這樣

{% highlight kotlin %}
fun requestApps() {
    showProgressBar()
    AppApi.getHotApps {
        hotApps ->
        ui {
            // 該塊內的程式碼將執行在主執行緒
            hideProgressBar()

            if (hotApps.size() == 0) {
                // no data, retry
                showRetryButton {
                    v ->
                    requestApps()
                }
            } else {
                adapter?.apps = hotApps
            }
        }
    }
}

程式碼解釋,功能是請求應用列表,請求時顯示進度條,失敗顯示重試按鈕,點選重試按鈕,重新請求資料,如此反覆,請求到資料到,將資料交給RecyclerView adapter, 並填充。

其中 getHotApps為非同步函式,其引數為網路請求完畢後的callback。

ui為Fragment或者Activity的擴充套件方法,其塊內的程式碼執行在主執行緒。

(Kotlin的語法糖,如果最後一個引數為Lambda表示式,那麼可以不寫在引數列表中, 如果Lambda表示式沒有引數,可以不寫 -> )

3,對屬性的支援,類似C#,麻麻再也不擔心我寫get set函式啦。

inner class AppAdapter : RecyclerView.Adapter<AppViewHolder>() {

      var apps: ArrayList<AppInfo>? = null
          set (value) {
              $apps = value
              notifyDataSetChanged()
          }

      // 省略其他程式碼
}

這裡使用了set塊,表示,如果該屬性在被賦值時,會呼叫Adapter的notifyXX 方法來通知檢視更新。

先介紹到這裡,開發Android,寫Java到很痛苦的小夥伴們,一起試試吧!

另外,Kotlin現在已經相對穩定,AndroidStudio (IntellJ Idea) 對Kotlin的支援相當好,畢竟是自家的東西。

有了val, 在也不用糾結 static final 和 final static 了。 :-)

相關文章