【Android+Kotlin】协程作业实践(协程,Bitmap,canvas,网络架构)

一:使用HttpURLConnection,Bitmap,Canvas,测试withcontent线程以及回调

1. 效果图

  1. 设置一张默认图片
    在这里插入图片描述
  2. 图片加载后
    在这里插入图片描述

2. 实现代码一,参考出处:参考了微信:小楠总

1. 协程导包

  implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.1.1"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1"
  1. ViewBinding导包(gradle->android)
 buildFeatures {
        viewBinding true
    }
  1. 网络权限导包
    <uses-permission android:name="android.permission.INTERNET"/>

2. Main代码

  1. 开启了一个主协程,内部切了两个IO协程的方法
  2. 运用了Canvas和Paint,这边如果不想加水印字体的话不用调用第二个方法,直接设置就行

class MainActivity : AppCompatActivity() {
    val TAG="MainAC"


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        var binding= ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        
        CoroutineScope(Dispatchers.Main).launch {
            Log.d(TAG, "onCreate: 当前线程为${Thread.currentThread().name}")
            val bitmap=getImageFromNet()
            Log.d(TAG, "onCreate 返回的bitmap: $bitmap")
            val bitmapcreate=createBT(bitmap,"夏鱼")
            Log.d(TAG, "onCreate 返回的bitmapcreate: $bitmapcreate")
            binding.imageView.setImageBitmap(bitmapcreate)
        }
    }



    private suspend fun getImageFromNet()=
        withContext(Dispatchers.IO){
        Log.d(TAG, "getImageFromNet: 当前线程为${Thread.currentThread().name}")
        //1. 定义一个Url
        val url = URL("https://picjumbo.com/wp-content/uploads/white-swans-near-charles-bridge-in-prague-2210x1473.jpg")
        //2. 调用openConnection方法即可
        val connection=url.openConnection() as HttpURLConnection
        //3. 获取数据流即可  将其编码为Bitmap
        val inputStream=connection.inputStream
        BitmapFactory.decodeStream(inputStream)
    }

    private suspend fun createBT(bitmap: Bitmap, mark:String)=
        withContext(Dispatchers.IO){
        Log.d(TAG, "createBT: 当前线程为${Thread.currentThread().name}")
        val w=bitmap.width
        val h=bitmap.height

        val bmp=Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888)
        val canvas=Canvas(bmp)
        val paint=Paint()
        //水印颜色
        paint. color= Color.parseColor( "#ffffff")
        //水印字体大小
        paint.textSize=150F
        //抗锯齿
        paint.isAntiAlias=true
        //绘制图像
        canvas.drawBitmap(bitmap,0f, 0f, paint)
        //绘制文字
        canvas.drawText(mark,0f,(h/2).toFloat(),paint)
        canvas.save()
        canvas.restore()

        return@withContext bmp
    }
    
}
  1. 从这里我们得知主协程命令,在切换IO协程结束后会切回主协程,之后开启的协程将和之前的一样(阻塞机制和协程结束机制)
  2. 观察发现 第一个函数没有返回值,第二个函数有返回值。但打印都没问题,原因是赋值机制。
    在这里插入图片描述

2. 改为Retrofit

1. 定义AppService接口接口

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值