android 开发 kotilin学习一

谷歌很早以前就宣布了亲儿子语言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字符串


这次的学习就记录到这里了



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值