没有Kotlin基础的小伙伴先进这里↓
Koltin基础文章
1、解决关键字冲突
public class JavaStudent {
public static String in = "INNNNNN";
public String getString() {
return null;
}
}
我们知道in在kotlin里是区间的意思,但是在Java中是可以用in来定义属性的,在Kotlin里直接调用会出现冲突的
解决冲突
fun main() {
// 解决冲突问题
println(JavaStudent.`in`)
}
2、Kotlin调用Java带有返回值的方法,Kotlin不确定Java会返回什么,所以你得用安全的方式来接收Java返回的值
// 错误的示范 JavaStudent().string.length
//正确的示范
var str: String ? = JavaStudent().string
println(str?.length)
3.接口回调的写法不同
public interface JavaCallback {
void show(String info);
}
public class JavaManager {
public void setCallback(JavaCallback javaCallback) {
javaCallback.show("爱码士");
}
}
Kotlin调用Java的Callback
// TODO kt 使用 Java Callback
// 第一种写法
JavaManager().setCallback(JavaCallback {
println(it)
})
// 第二种写法
JavaManager().setCallback(object : JavaCallback{
override fun show(info: String?) {
println(info)
}
})
// 第三种写法
val callback = JavaCallback {
println(it)
}
JavaManager().setCallback(callback)
// 第四种写法
val callback2 = object : JavaCallback{
override fun show(info: String?) {
println(info)
}
}
JavaManager().setCallback(callback2)
Kotlin 调用Kotlin的CallBack
interface KTCallback {
fun show(name: String)
}
class KtManager {
fun setCallback(callback: KTCallback) {
callback.show("Kt Derry")
}
}
// TODO kt 使用 tk Callback
// 1
KtManager().setCallback(object : KTCallback{
override fun show(name: String) {
}
})
// 2
val c = object : KTCallback{
override fun show(name: String) { }
}
KtManager().setCallback(c)
// Kt不能像Java一样的写法
/*KtManager().setCallback(KTCallback{
})*/
4、形参里的Class对象
// 行参里面 java
fun showClass(clazz: Class<JavaStudent>) { }
// 全部都用 kt
fun showClass2(clazz: KClass<KtStudent>) { }
showClass(JavaStudent::class.java)//传递Java的Class
showClass2(KtStudent::class)//传递Kotlin的Class
使用WanAndroid的服务器的API完成一个登录功能
class APIClient {
private object Holder{
val INSTANCE=APIClient()
}
companion object{
val instance=Holder.INSTANCE
}
/***
* 实例化WanAndroidAPI
*/
fun <T> instanceRetrofit(apiInterface:Class<T>):T{
val mOkHttpClient=OkHttpClient().newBuilder()
.readTimeout(10000,TimeUnit.SECONDS)
.connectTimeout(10000,TimeUnit.SECONDS)
.writeTimeout(10000,TimeUnit.SECONDS)
.build()
val mRetrofit=Retrofit.Builder()
.baseUrl("https://www.wanandroid.com")
//请求方
.client(mOkHttpClient)
//响应方
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build()
return mRetrofit.create(apiInterface)
}
}
interface WanAndroidAPI {
/***
* 登录API
*/
@POST("/user/login")
@FormUrlEncoded
fun loginAction(@Field("username")username:String,
@Field("password")password:String)
:Observable<ResponseWrapper<LoginResponse>>
}
服务端数据的返回格式,
{
data:{},
errorCode:100,
errorMsg:""
}
只有data是不确定的,我们用泛型来接收它
data class ResponseWrapper<T>(val data:T,var errorCode:Int,val errorMsg:String)
登录接口返回信息的Bean
//泛型的通配符 java里是? Kotlin里是*
//允许服务器字段为null,在字段后面加?
data class LoginResponse(val admin:Boolean,
val chapterTops:List<*>,
val collectIds:List<*>,
val email:String?,
val icon :String?,
val id: String?,
val nickname: String?,
val password: String?,
val publicName: String?,
val token: String?,
val type: Int,
val username: String?)
/***
* RxJava 自定义操作符
*/
abstract class APIResponse<T>(val context:Context):Observer<ResponseWrapper<T>> {
private var isShow=true
//次构造
constructor(context: Context,isShow:Boolean= false):this(context){
this.isShow=isShow
}
abstract fun onSuccess(data:T?)
abstract fun onFailure(errorMsg:String?)
override fun onComplete() {
// 取消加载
LoadingDialog.cancel()
}
override fun onSubscribe(d: Disposable) {
if(isShow){
LoadingDialog.show(context)
}
}
override fun onNext(t: ResponseWrapper<T>) {
if(t.data==null){
onFailure("msg:${t.errorMsg}")
}else{
onSuccess( t.data)
}
}
override fun onError(e: Throwable) {
LoadingDialog.cancel()
onFailure(e.message)
}
}
private fun initView() {
user_login_bt.setOnClickListener {
doLogin()
}
}
private fun doLogin() {
val userName=user_phone_et.text.toString()
val pwd=user_password_et.text.toString()
APIClient.instance.instanceRetrofit(WanAndroidAPI::class.java)
.loginAction(userName,pwd)
.subscribeOn(Schedulers.io())//在IO线程进行网络请求
.observeOn(AndroidSchedulers.mainThread())//在主线程更新UI
.subscribe(object:APIResponse<LoginResponse>(this){
override fun onSuccess(data: LoginResponse?) {
Toast.makeText(this@LoginActivity,"登陆成功嘿嘿~",Toast.LENGTH_SHORT).show()
}
override fun onFailure(errorMsg: String?) {
// TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
Toast.makeText(this@LoginActivity,errorMsg,Toast.LENGTH_SHORT).show()
}
})
// .
}
主要目的 a. 掌握获取 GridPanel 当前行的各个字段值的方法 b. 掌握如何将前台数...
Mysql数据库五——mysql事务及引擎 一、事务 1、事务的概念 2、事务的ACID特点 ...
关于我的SWFObject V1.5的使用过程,以 上篇 中的介绍暂时告一段落了,下面我将...
Asp 解析 XML并分页显示,示例源码如下: 复制代码 代码如下: !DOCTYPE html PUB...
例如: 我们在百度中搜索 尊托云数,则网址后面的参数就是 http://www.baidu.com/...
如果你很在意你的终端的外观的话,一个跨 shell 的提示符可以让你轻松地定制和配...
接着昨天的,如果forEach中的items类型是map或者Collection类型的,怎样使用增强...
本文实例为大家分享了js实现电灯开关效果的具体代码,供大家参考,具体内容如下 ...
我之前写过一个简易版的自动+手动轮播图: 简易轮播图 但是这个轮播图在切换的时...
发现每个编辑实例都可以加载不同的css样式表,而且其样式不继承 页面的css。 于...