谷歌很早以前就宣布了亲儿子语言kotilin来替代java,虽然目前并没有替代,但是市面上已经有部分人员在使用这门语言了,所以,学习一下对将来求职这些也有帮助;
最近学习了两天,记录一下心得;
第一,初始化变量
这个网上虽然有很多,但是都是说的通过by lazy这种方式初始化如下
private val mImageLoader: ImageLoader by lazy { ImageLoader.getInstance() }
但是有时候我们希望定义为全局变量得时候,在调用时再初始化,应该怎么做呢,其实也是可以的,直接在class下这样写就可以了:
private val mImageLoader: ImageLoader?=null
这种没有初始化的变量在使用时会编译器报错,这种如何处理呢,很简单,在报错的位置加上? 如下:
mImageLoader?.init(ImageLoaderConfiguration.createDefault(this))问题又来了,如我们例子里面,我们初始化了imageload希望它是全局的,怎么办,这个网上也有说,通过companion包裹,加入getstatic,写法如下
companion object { private val mImageLoader: ImageLoader by lazy { ImageLoader.getInstance() } private val defImageOptions: DisplayImageOptions by lazy { DisplayImageOptions.Builder() .showStubImage(R.drawable.ic_launcher_background) .displayer(CommonBitmapDisplayer()) .showImageForEmptyUri(R.drawable.ic_launcher_background) .showImageOnFail(R.drawable.ic_launcher_background).cacheInMemory() .cacheOnDisc().build() } fun getStatic() { } fun imgLoading(uri: String, imageview: ImageView) { mImageLoader.displayImage(uri, imageview, defImageOptions) } fun imgLoadingCircle(uri: String, imageview: ImageView, id: Int) { val ImageOptions = DisplayImageOptions.Builder() .showStubImage(id).displayer(CircleBitmapDisplayer()) .showImageForEmptyUri(id).showImageOnFail(id).cacheInMemory() .cacheOnDisc().build() mImageLoader.displayImage(uri, imageview, ImageOptions) } }
kotilin有个非常方便的东西,有了它我们就可以不用调用findviewbyid了,还不用插件,实在是方便,只需要在类里面加上
import kotlinx.android.synthetic.main.activity_main.*
这里的activity_main是对应的布局,加上后就可以直接用id来调用;如果是在适配器或其他类里面,加上后也可以通过view.id来调用(测试可以调用,不过对应页面还没有试过会不会出错,明天再试试) 如下
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { var holder: MyViewHolder //重用view var v: View if (convertView == null) { holder = MyViewHolder() v = LayoutInflater.from(context).inflate(R.layout.activity_main, parent, false) //设置tag v.tag = holder } else { v = convertView //获取tag并强转 holder = v.tag as MyViewHolder } v.button_load_network.text=""; return v }
kotilin没有new关键字,创建新的对象直接通过var xx:类型 这种方式创建,匿名类怎么创建呢,我使用asynctask来试了一下,如下
object: BaseAsyncTask<Void,Void,JSONObject>(){ override fun doInBackground(vararg params: Void): JSONObject { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } }.executeTask(); val task:BaseAsyncTask<Void,Void,JSONObject>; task=object: BaseAsyncTask<Void,Void,JSONObject>(){ override fun doInBackground(vararg params: Void): JSONObject { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } }
注意 里面的todo需要注释掉,不然编译通过后运行到这里会报错
建议不要用List
kotilin下的List和Java包里面的List是不一样的,是不能操作的,没有对应的add remove 等等操作;无论是通过listof和mutableListof创建的列表都是一样的,从java转过来的我们还是用ArrayList比较好,可以通过arrayListOf进行创建;
我demo里面用switch写了几个按键事件分支,里面有List的使用方法和调用截图
fun onClick( view:View) { when(view.id) { R.id.button_loadpic->{ tx_tips.text="loading pic" kotlinApplication.imgLoading("http://ycp.ycwb.com/ycpFileSystem/images/contentImg/2017/01/20/1484899147166028109_big.jpg",image_pic) } R.id.button_load_network->{ object: BaseAsyncTask<Void,Void,String>(){ override fun doInBackground(vararg params: Void): String { // TODO("not implemented") //To change body of created functions use File | Settings | File Templates. var client:OkHttpClient = OkHttpClient(); val request: Request = Request.Builder().url("https://www.zkp2p.com/v4/launcher").build(); val response: Response = client.newCall(request).execute(); if (response.isSuccessful()) { return response.body().string(); } return "err:"+response.code(); } override fun onPostExecute(result: String?) { super.onPostExecute(result) tx_tips2.text="loading over" tx_tips.text=result } override fun onPreExecute() { super.onPreExecute() tx_tips2.text="start loading" } }.executeTask() } R.id.button_gson->{ tx_tips2.text="start convert" val gson:Gson=Gson(); val result:launcher= gson.fromJson(tx_tips.text.toString(),launcher::class.java) tx_tips2.text="convert over\n title0="+result.data[0].title } R.id.button_gson2->{ tx_tips2.text="start convert" var data:launcher=launcher(1, arrayListOf<launcher.item>( launcher.item("title0","haha") ,launcher.item("title1","hehe") )) data?.data[0]=launcher.item("change title","haha"); val gson:Gson=Gson(); tx_tips.text=gson.toJson(data) tx_tips2.text="convert over" } else->{} } } data class launcher (val code:Int,val data:ArrayList<item>) { data class item (val title:String,val path:String) { } }上面使用了imageloader加载了一张网络图片,其它按钮则通过okhttp拉了一串json字符串,通过gson解析json字符串为对象并取了两个值,通过gson初始化了一段数据转了json
最后附一下demo效果图,依次是 初始页面,加载图片后,点击从网络加载json字符串,点击解析json,对象转json字符串
这次的学习就记录到这里了