Kotlin实践记录

简介: Kotlin中网络请求和Json解析:Request(url).run()为Kotlin中的网络请求方式,Json解析是自己封装类的操作。Json.get().toObject(Request(url).

Kotlin中网络请求和Json解析:

Request(url).run()为Kotlin中的网络请求方式,Json解析是自己封装类的操作。
Json.get().toObject(Request(url).run(), GankNewsList::class.java).results 是将返回结果转换为具体的bean对象
DataLoader.kt 
import com.soyoungboy.kotlinapp.util.json.Json

/**
 * Created by soyoungboy on 2018/1/29.
 */
class DataLoader {

    fun getGankNewsList(date: String): List<GankNews> {
        val url = Request.BASE_URL + date
        return Json.get().toObject(Request(url).run(), GankNewsList::class.java).results
    }

    fun getGankPictureList(date: String): ArrayList<GankPicture> {
        val url = Request.BASE_URL + date
        return Json.get().toObject(Request(url).run(), GankPictureList::class.java).results
    }
}
Json.kt
package com.soyoungboy.kotlinapp.util.json

abstract class Json internal constructor() {


    abstract fun toJson(src: Any): String

    abstract fun <T> toObject(json: String, claxx: Class<T>): T

    abstract fun <T> toObject(bytes: ByteArray, claxx: Class<T>): T

    abstract fun <T> toList(json: String, claxx: Class<T>): List<T>?

    companion object {
        private var json: Json? = null


        fun get(): Json {
            if (json == null) {
                json = GsonImpl()
            }
            return json as Json
        }
    }
}

具体的json解析封装:

package com.soyoungboy.kotlinapp.util.json

import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import java.util.*

/**
 * Created by soyoungboy on 2017/12/25.
 */

class GsonImpl : Json() {
    private val gson = Gson()


    override fun toJson(src: Any): String {
        return gson.toJson(src)
    }


    override fun <T> toObject(json: String, claxx: Class<T>): T {
        return gson.fromJson(json, claxx)
    }


    override fun <T> toObject(bytes: ByteArray, claxx: Class<T>): T {
        return gson.fromJson(String(bytes), claxx)
    }


    override fun <T> toList(json: String, claxx: Class<T>): List<T>? {
        val type = object : TypeToken<ArrayList<T>>() {

        }.type
        return gson.fromJson<List<T>>(json, type)
    }

}

bean对象:

GankNewsList.kt

package com.soyoungboy.kotlinapp.bean

/**
 * Created by soyoungboy on 2018/1/29.
 */
class GankNewsList(val error: Boolean, val results: List<GankNews>)

GankNews.kt

package com.soyoungboy.kotlinapp.bean

/**
 * Created by soyoungboy on 2018/1/29.
 */
data class GankNews(val _id: String,
                    val createdAt: String,
                    val desc: String,
                    val publishedAt: String,
                    val type: String,
                    val url: String,
                    val used: Boolean,
                    val who: String)

Kotlin异步线程和主线程之间的切换

async {}为异步代码块
uiThread {}为主线程代码块
private fun getGanksNewsList() = async {
        val news = DataLoader().getGankNewsList("data/all/20/2")
        uiThread {
            forecast_list.adapter = GankNewsAdapter(news) {
                val intent = Intent()
                intent.setClass(this@GankNewsListActivity, WebActivity::class.java)
                intent.putExtra("url", it.url)
                startActivity(intent)
            }
        }

    }

kotlin跳转和数据传递:

intent跳转并携带数据:

val intent = Intent()
intent.setClass(this@GankNewsListActivity, WebActivity::class.java)
intent.putExtra("url", it.url)
startActivity(intent)

接收数据:

intent.getStringExtra("url")为接收数据操作
override fun getUrl(): String {
        return intent.getStringExtra("url")
    }

kotlin图片加载:

由于Kotlin和Java代码之间可以相互操作,所以Kotlin可以调用Android相关的图片加载库,这里用Glide举例子:

引入Glide

compile 'com.github.bumptech.glide:glide:4.1.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.1.1'
compile 'com.github.bumptech.glide:okhttp3-integration:4.0.0'

对Glide的封装

代码见:

https://github.com/soyoungboy/KotlinApp/tree/master/app/src/main/java/com/soyoungboy/kotlinapp/util/glide

调用如上ImageUtils进行图片加载缓存

class ViewHolder(val view: View, val itemClickListener: (GankPicture) -> Unit) : RecyclerView.ViewHolder(view) {
        fun bind(pictures: GankPicture) {
            val meizi = view.meizi as ImageView
            ImageUtils.loadImage(pictures.url,meizi)
            view.title.text = pictures.desc
            view.setOnClickListener {
                itemClickListener(pictures)
                view.context.longToast(pictures.url)
            }
        }
    }

kotlin之RecyclerView对应的Adapter

val items: List<GankPicture> 为要传进来进行展示的数据
view.setOnClickListener {
                itemClickListener(pictures)
                view.context.longToast(pictures.url)
            }
为点击事件

package com.soyoungboy.kotlinapp.adapter

import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import com.soyoungboy.kotlinapp.R
import com.soyoungboy.kotlinapp.bean.GankPicture
import com.soyoungboy.kotlinapp.util.glide.ImageUtils
import kotlinx.android.synthetic.main.item_meizi.view.*
import org.jetbrains.anko.longToast

/**
 * Created by soyoungboy on 2018/1/29.
 */
class GankPictureAdapter(val items: List<GankPicture>, val itemClickListener: (GankPicture) -> Unit) : RecyclerView.Adapter<GankPictureAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_meizi, parent, false)
        return ViewHolder(view, itemClickListener)
    }

    override fun getItemCount(): Int = items.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(items[position])
    }

    class ViewHolder(val view: View, val itemClickListener: (GankPicture) -> Unit) : RecyclerView.ViewHolder(view) {
        fun bind(pictures: GankPicture) {
            val meizi = view.meizi as ImageView
            ImageUtils.loadImage(pictures.url,meizi)
            view.title.text = pictures.desc
            view.setOnClickListener {
                itemClickListener(pictures)
                view.context.longToast(pictures.url)
            }
        }
    }
}

实践的代码见我的github:https://github.com/soyoungboy/KotlinApp,里面是我学习Kotlin的一些小练习

 

相关文章
|
23天前
|
调度 数据库 Android开发
构建高效Android应用:Kotlin协程的实践与优化
在Android开发领域,Kotlin以其简洁的语法和平台友好性成为了开发的首选语言。其中,Kotlin协程作为处理异步任务的强大工具,它通过提供轻量级的线程管理机制,使得开发者能够在不阻塞主线程的情况下执行后台任务,从而提升应用性能和用户体验。本文将深入探讨Kotlin协程的核心概念,并通过实例演示如何在实际的Android应用中有效地使用协程进行网络请求、数据库操作以及UI的流畅更新。同时,我们还将讨论协程的调试技巧和常见问题的解决方法,以帮助开发者避免常见的陷阱,构建更加健壮和高效的Android应用。
31 4
|
25天前
|
移动开发 Java Android开发
构建高效Android应用:Kotlin协程的实践之路
【2月更文挑战第31天】 在移动开发领域,性能优化和流畅的用户体验一直是开发者追求的目标。随着Kotlin语言的流行,其异步编程解决方案——协程(Coroutines),为Android应用带来了革命性的并发处理能力。本文将深入探讨Kotlin协程的核心概念、设计原理以及在Android应用中的实际应用案例,旨在帮助开发者掌握这一强大的工具,从而提升应用的性能和响应能力。
|
26天前
|
移动开发 调度 Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【2月更文挑战第30天】 在移动开发领域,尤其是针对Android平台,性能优化和应用流畅度始终是开发者关注的重点。近年来,Kotlin语言凭借其简洁性和功能性成为Android开发的热门选择。其中,Kotlin协程作为一种轻量级的线程管理解决方案,为异步编程提供了强大支持,使得编写非阻塞性代码变得更加容易。本文将深入分析Kotlin协程的核心优势,并通过实际案例展示如何有效利用协程提升Android应用的性能和响应速度。
|
1月前
|
数据库 Android开发 开发者
构建高性能微服务架构:从理论到实践构建高效Android应用:探究Kotlin协程的优势
【2月更文挑战第16天】 在当今快速迭代和竞争激烈的软件市场中,微服务架构以其灵活性、可扩展性和独立部署能力而受到企业的青睐。本文将深入探讨如何构建一个高性能的微服务系统,涵盖从理论基础到具体实现的各个方面。我们将重点讨论服务拆分策略、通信机制、数据一致性以及性能优化等关键主题,为读者提供一个清晰、实用的指南,以便在复杂多变的业务环境中构建和维护健壮的微服务体系结构。 【2月更文挑战第16天】 在移动开发领域,性能优化和流畅的用户体验是至关重要的。随着技术的不断进步,Kotlin作为一种现代编程语言,在Android开发中被广泛采用,尤其是其协程特性为异步编程带来了革命性的改进。本文旨在深入
238 5
|
15天前
|
Java Android开发 开发者
构建高效Android应用:Kotlin协程的实践与优化
在响应式编程范式日益盛行的今天,Kotlin协程作为一种轻量级的线程管理解决方案,为Android开发带来了性能和效率的双重提升。本文旨在探讨Kotlin协程的核心概念、实践方法及其在Android应用中的优化策略,帮助开发者构建更加流畅和高效的应用程序。通过深入分析协程的原理与应用场景,结合实际案例,本文将指导读者如何优雅地解决异步任务处理,避免阻塞UI线程,从而优化用户体验。
|
Android开发 Kotlin
Android Studio 制作聊天界面实践(Kotlin版)
Android Studio 制作聊天界面实践(Kotlin版)
517 0
Android Studio 制作聊天界面实践(Kotlin版)
|
9天前
|
移动开发 API Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【4月更文挑战第7天】 在移动开发领域,性能优化和应用响应性的提升一直是开发者追求的目标。近年来,Kotlin语言因其简洁性和功能性在Android社区中受到青睐,特别是其对协程(Coroutines)的支持,为编写异步代码和处理并发任务提供了一种更加优雅的解决方案。本文将探讨Kotlin协程在Android开发中的应用,揭示其在提高应用性能和简化代码结构方面的潜在优势,并展示如何在实际项目中实现和优化协程。
|
26天前
|
移动开发 安全 Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【2月更文挑战第30天】 在移动开发领域,性能优化和应用流畅度始终是开发者追求的核心目标。特别是对于Android平台,由于设备多样性和系统资源限制,如何提升应用的响应速度和处理效率成为关键挑战。近年来,Kotlin语言因其简洁、安全且易于阅读的特性而广受欢迎。其中,Kotlin协程作为一种轻量级的线程管理方案,提供了异步编程的强大能力,使得编写非阻塞性代码变得简单高效。本文将深入探讨Kotlin协程在Android开发中的应用优势,并通过实例演示如何在实际项目中有效利用协程来改善应用性能。
|
6月前
|
缓存 API Android开发
Kotlin 学习笔记(七)—— Flow 数据流学习实践指北(三)冷流转热流以及代码实例(下)
Kotlin 学习笔记(七)—— Flow 数据流学习实践指北(三)冷流转热流以及代码实例(下)
60 0
|
6月前
|
缓存 Java Kotlin
Kotlin 学习笔记(七)—— Flow 数据流学习实践指北(三)冷流转热流以及代码实例(上)
Kotlin 学习笔记(七)—— Flow 数据流学习实践指北(三)冷流转热流以及代码实例(上)
51 0