用Handler写一个网络下载图片的项目 activity代码 xml 代码 包含1个进度条1个按钮1个ImageView Kotlin
时间: 2024-02-29 12:56:30 浏览: 77
一个带有缓存的下载网络图片的ImageView
5星 · 资源好评率100%
好的,这是一个使用Handler和Kotlin语言编写的网络下载图片的项目,包含一个进度条、一个按钮和一个ImageView。
首先,我们需要在XML布局文件中添加一个ProgressBar、一个Button和一个ImageView:
```xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="gone" />
<Button
android:id="@+id/btnDownload"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Download"
android:layout_below="@id/progressBar"
android:layout_centerHorizontal="true" />
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/btnDownload"
android:scaleType="fitCenter" />
</RelativeLayout>
```
然后,在Kotlin代码中,我们需要定义一个Handler对象,用于更新UI界面。我们还需要使用AsyncTask类执行后台下载任务,并使用URLConnection和InputStream读取网络数据流。最后,我们需要将下载的图片设置到ImageView中。
```kotlin
import android.graphics.BitmapFactory
import android.os.AsyncTask
import android.os.Bundle
import android.os.Handler
import android.os.Message
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import java.io.IOException
import java.io.InputStream
import java.net.HttpURLConnection
import java.net.URL
class MainActivity : AppCompatActivity() {
private val handler: Handler = object : Handler() {
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
if (msg.what == 1) {
val bitmap = msg.obj as android.graphics.Bitmap
imageView.setImageBitmap(bitmap)
progressBar.visibility = View.GONE
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btnDownload.setOnClickListener {
DownloadImageTask().execute("https://www.example.com/image.jpg")
}
}
private inner class DownloadImageTask : AsyncTask<String, Void, android.graphics.Bitmap>() {
override fun onPreExecute() {
super.onPreExecute()
progressBar.visibility = View.VISIBLE
}
override fun doInBackground(vararg urls: String): android.graphics.Bitmap? {
val urlString = urls[0]
var inputStream: InputStream? = null
var httpURLConnection: HttpURLConnection? = null
try {
val url = URL(urlString)
httpURLConnection = url.openConnection() as HttpURLConnection
httpURLConnection.connect()
inputStream = httpURLConnection.inputStream
return BitmapFactory.decodeStream(inputStream)
} catch (e: IOException) {
e.printStackTrace()
} finally {
httpURLConnection?.disconnect()
try {
inputStream?.close()
} catch (e: IOException) {
e.printStackTrace()
}
}
return null
}
override fun onPostExecute(result: android.graphics.Bitmap?) {
super.onPostExecute(result)
if (result != null) {
val message = Message()
message.what = 1
message.obj = result
handler.sendMessage(message)
}
}
}
}
```
以上就是一个使用Handler和Kotlin语言编写的网络下载图片的项目。当用户点击Download按钮时,会执行AsyncTask类中的doInBackground()方法,下载图片并返回Bitmap对象。然后,使用Handler对象将Bitmap对象发送到主线程,并在ImageView中显示图片。同时,进度条在图片下载完成后消失。
阅读全文