当前位置: 代码迷 >> 综合 >> 【Android+Kotlin】协程作业实践(协程,Bitmap,canvas,网络架构)
  详细解决方案

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

热度:89   发布时间:2023-12-15 11:08:57.0

一:使用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. 定义一个Urlval 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. 获取数据流即可 将其编码为Bitmapval inputStream=connection.inputStreamBitmapFactory.decodeStream(inputStream)}private suspend fun createBT(bitmap: Bitmap, mark:String)=withContext(Dispatchers.IO){
    Log.d(TAG, "createBT: 当前线程为${
      Thread.currentThread().name}")val w=bitmap.widthval h=bitmap.heightval 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接口接口

  相关解决方案