Kotlin 给ImageView动态设置网络地址
1 // 把传过来的路径转成url 2 var myurl = URL(item.toString()) 3 // 获取链接 4 var conn = myurl.openConnection() 5 // 设置超时时间为 6s 6 conn.connectTimeout = 6000 7 conn.doInput = true 8 // 不使用缓存 9 conn.useCaches = false 10 // 开始连接 11 conn.connect() 12 // 得到从服务器端发回的数据 13 var imgbit = conn.getInputStream() 14 // 使用工厂把网络的输入流生产Bitmap 15 var bmp = BitmapFactory.decodeStream(imgbit) 16 // 关闭 17 imgbit.close()
单纯这样写,在运行的时候会抛出android.os.NetworkOnMainThreadException异常,字面意思是主线程的网络异常
经查询后,一个APP如果在主线程中请求网络操作,将会抛出此异常。Android这个设计是为了防止网络请求时间过长而导致界面假死的情况发生。
所以我们让他在子线程中运行就可以了
doAsync { // 把传过来的路径转成url var myurl = URL(item.toString()) // 获取链接 var conn = myurl.openConnection() // 设置超时时间为 6s conn.connectTimeout = 6000 conn.doInput = true // 不使用缓存 conn.useCaches = false // 开始连接 conn.connect() // 得到从服务器端发回的数据 var imgbit = conn.getInputStream() // 使用工厂把网络的输入流生产Bitmap var bmp = BitmapFactory.decodeStream(imgbit) // 关闭 imgbit.close() uiThread { // 动态给imageview设置图片 viewHolder.imgItem.setImageBitmap(bmp) } }
就能完美运行了!