آموزش دانلود فایل در کاتلین اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به زبان کاتلین به آموزش دانلود فایل در کاتلین اندروید می پردازیم برای اینکه فایل را از url دانلود کنید راه های مختلفی از جمله استفاده از کلاس DownloadManager خود اندروید است ولی این کلاس برپایه ی درستی پیاده سازی نشده و از حافظه زیادی برای انجام عملیات استفاده می کند در ادامه با استفاده از کتابخانه RxDownload به راحتی می توانید فایل را از اینترنت دانلود کنید.
کتابخانه فوف العاده که عاشقش خواهید شد

ابتدا باید این کتابخانه را به پروژه خود اضافه کنید برای اینکار وارد Build.gradle شده و repo زیر را اضافه کنید.
maven { url 'https://jitpack.io' }
وارد فایل گریدل دوم شده (Module) و خط زیر را به dependencies اضافه کنید.
//Load on demand implementation "com.github.ssseasonnn.RxDownload:rxdownload4:1.0.9" implementation "com.github.ssseasonnn.RxDownload:rxdownload4-manager:1.0.9" implementation "com.github.ssseasonnn.RxDownload:rxdownload4-notification:1.0.9" implementation "com.github.ssseasonnn.RxDownload:rxdownload4-recorder:1.0.9" or: //Add all dependencies of RxDownload4 implementation "com.github.ssseasonnn:RxDownload:1.0.9"
دقت کنید چهار خط اول هر بخشی از کتابخانه است که به صورت تکه تکه درست شده تا حجم برنامه را زیاد نکند و بسته به نیاز هر برنامه نویس آنها را اضافه کند خط آخر تمامی کتابخانه را به پروژه اضافه می کند.
نحوه دانلود فایل همانند زیر می تواند انجام شود.
disposable = url.download()
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(
onNext = { progress ->
//download progress
button.text = "${progress.downloadSizeStr()}/${progress.totalSizeStr()}"
button.setProgress(progress)
},
onComplete = {
//download complete
button.text = "Open"
},
onError = {
//download failed
button.text = "Retry"
}
)
در ادامه برخی از متدهای کاربردی آن را باهم بررسی می کنیم.
برای توقف دانلود
disposable.dispose()
دریافت فایل
val file = url.file() // or val file = task.file() // use file...
حذف فایل
url.delete() // or task.delete()
یک ویژگی به نام TaskManager برای این کتابخانه وجود دارد که به شما status های بیشتری از فایل دانلودی میدهد.
val taskManager = url.manager()
//keep this tag for dispose
val tag = taskManager.subscribe { status ->
// Receive download status
when (status) {
is Normal -> {}
is Started -> {}
is Downloading -> {}
is Paused -> {}
is Completed -> {}
is Failed -> {}
is Deleted -> {}
}
}
کنسل کردن Taskmanager
//dispose tag taskManager.dispose(tag)
شروع دانلود
taskManager.start()
توقف دانلود
taskManager.stop()
حذف دانلود
taskManager.delete()
دریافت فایل از Taskmanger
val file = taskManager.file()
برای اینکه چند فایل را همزمان دانلود کنید می توانید از کد زیر استفاده کنید.
// Query task with urls
RxDownloadRecorder.getTaskList("url1","url2","url3")
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy { list ->
// list of TaskEntity
}
برای اینکه لیسیت فایل های دانلود شده را به دست آورید
RxDownloadRecorder.getAllTask()
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy { list ->
//list of TaskEntity
}
دریافت تعداد فایل های دانلودی به صورت صفحه به صفحه
RxDownloadRecorder.getTaskList(page, pageSize)
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy { list ->
//list of TaskEntity
}
برای شروع دانلود فایل در حالت لیستی از فایل ها از کد زیر برای شروع دانلود استفاده کنید.
RxDownloadRecorder.startAll()
متوقف کردن
RxDownloadRecorder.stopAll()
حذف کردن
RxDownloadRecorder.deleteAll()
یک مثال کامل برای دوستانی که نمی توانند از syntax استفاده کنند.
import android.annotation.SuppressLint
import android.os.Bundle
import android.text.method.ScrollingMovementMethod
import androidx.appcompat.app.AppCompatActivity
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.rxkotlin.subscribeBy
import kotlinx.android.synthetic.main.activity_basic_download.*
import kotlinx.android.synthetic.main.common_title.*
import zlc.season.rxdownload.demo.R
import zlc.season.rxdownload.demo.utils.click
import zlc.season.rxdownload.demo.utils.installApk
import zlc.season.rxdownload.demo.utils.load
import zlc.season.rxdownload4.download
import zlc.season.rxdownload4.file
import zlc.season.rxdownload4.utils.safeDispose
class DemoActivity : AppCompatActivity() {
private var disposable: Disposable? = null
private var state = NORMAL
companion object {
const val iconUrl = "http://pp.myapp.com/ma_icon/0/icon_10910_1564113626/256"
const val url = "https://dldir1.qq.com/weixin/android/weixin706android1460.apk"
// const val url = "http://dlied5.myapp.com/myapp/1104466820/cos.release-40109/10006654_com.tencent.tmgp.sgame_u367648_1.51.1.23_zmvjbg.apk"
const val NORMAL = 0
const val STARTED = 1
const val PAUSED = 2
const val COMPLETED = 3
const val FAILED = 4
}
@SuppressLint("NewApi")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_basic_download)
back.click { finish() }
icon.load(iconUrl)
tv_name.text = "微信"
tv_size.text = getString(R.string.wechat_desc)
tv_size.movementMethod = ScrollingMovementMethod()
button.click { onClick() }
}
override fun onDestroy() {
super.onDestroy()
disposable.safeDispose()
}
private fun onClick() {
when (state) {
NORMAL -> start()
STARTED -> stop()
PAUSED -> start()
COMPLETED -> install()
FAILED -> start()
}
}
@SuppressLint("SetTextI18n")
private fun start() {
disposable = url.download()
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy(
onNext = {
button.text = "${it.downloadSizeStr()}/${it.totalSizeStr()}"
button.setProgress(it)
},
onComplete = {
state = COMPLETED
button.text = "安装"
},
onError = {
state = FAILED
button.text = "重试"
}
)
state = STARTED
button.text = "下载中..."
}
private fun stop() {
state = PAUSED
disposable.safeDispose()
button.text = "继续"
}
private fun install() {
val file = url.file()
if (file.exists()) {
installApk(file)
}
}
}
موفق و پیروز باشید.
آموزش برنامه نویسی اندروید |