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() } }) // . }
作者:爱码士赵Sir
链接:https://juejin.cn/post/6950576674740109325
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。