前几天抽空写了个文件和数据同时上传的内容。因为是go语言服务端为主,虽然客户端是kotlin android,但是没有发在这个文集中。有感兴趣的朋友,可以去 go学习笔记 中的编号 62 的笔记中找来看。
今天偶尔遇到服务端下载图片,需要异步更新的代码。于是写了个kotlin例子。
先交代一下场景。服务器上放着很多图片,android端需要同时下载好多张图片,并且显示。
但是android下载数据是很快的,可图片文件下载赶不上速度,就需要使用异步更新了。
这个例子使用了 Handler 和 Thread。
首先在主线程中,声明 Handler
val handle = object: Handler(){
override fun handleMessage(msg: Message?) {
holder?.txtvwPhoto?.setImageURI(Uri.fromFile(File("/sdcard/jian/" + manager?.Id.toString() + "_photo.png")))
}
}
这里的 holder?.txtvwPhoto?.setImageURI(Uri.fromFile(File(“/sdcard/jian/” + manager?.Id.toString() + “_photo.png”))) 是为了让主线程在子线程执行完毕后执行的语句。这里是显示一个指定地址的图片。
Thread(object : Runnable{
override fun run() {
try {
ppp = SavaImage(GetImageInputStream(ppp)!!, Environment.getExternalStorageDirectory().getPath() + "/jian", manager?.Id.toString() + "_photo.png")
val msg = Message.obtain()
msg.obj = ""
//返回主线程执行
handle.sendMessage(msg)
} catch (e: Exception) {
Log.d("recycler下载网络图片:------》", e.message)
}
}
}).start()
在子线程中,Thread做了一些下载的操作。ppp = SavaImage(GetImageInputStream(ppp)!!, Environment.getExternalStorageDirectory().getPath() + “/jian”, manager?.Id.toString() + “_photo.png”)
当然,你可以在这里写你想做的任何耗时的操作。
然后,用 handle.sendMessage(msg) 顺利回城了。
这个例子中的 msg并没有起到什么作用。而利用这个例子,完全可以让msg带一些数据返回主线程。这就是异步更新了。