آموزش دانلود فایل در کاتلین اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به زبان کاتلین به آموزش دانلود فایل در کاتلین اندروید می پردازیم برای اینکه فایل را از url دانلود کنید راه های مختلفی از جمله استفاده از کلاس DownloadManager خود اندروید است ولی این کلاس برپایه ی درستی پیاده سازی نشده و از حافظه زیادی برای انجام عملیات استفاده می کند در ادامه با استفاده از کتابخانه RxDownload به راحتی می توانید فایل را از اینترنت دانلود کنید.
کتابخانه فوف العاده که عاشقش خواهید شد
ابتدا باید این کتابخانه را به پروژه خود اضافه کنید برای اینکار وارد Build.gradle شده و repo زیر را اضافه کنید.
1 | maven { url 'https://jitpack.io' } |
وارد فایل گریدل دوم شده (Module) و خط زیر را به dependencies اضافه کنید.
1 2 3 4 5 6 7 8 | //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" |
دقت کنید چهار خط اول هر بخشی از کتابخانه است که به صورت تکه تکه درست شده تا حجم برنامه را زیاد نکند و بسته به نیاز هر برنامه نویس آنها را اضافه کند خط آخر تمامی کتابخانه را به پروژه اضافه می کند.
نحوه دانلود فایل همانند زیر می تواند انجام شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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" } ) |
در ادامه برخی از متدهای کاربردی آن را باهم بررسی می کنیم.
برای توقف دانلود
1 | disposable.dispose() |
دریافت فایل
1 2 3 4 | val file = url.file() // or val file = task.file() // use file... |
حذف فایل
1 2 3 | url.delete() // or task.delete() |
یک ویژگی به نام TaskManager برای این کتابخانه وجود دارد که به شما status های بیشتری از فایل دانلودی میدهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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
1 2 | //dispose tag taskManager.dispose(tag) |
شروع دانلود
1 | taskManager.start() |
توقف دانلود
1 | taskManager.stop() |
حذف دانلود
1 | taskManager.delete() |
دریافت فایل از Taskmanger
1 | val file = taskManager.file() |
برای اینکه چند فایل را همزمان دانلود کنید می توانید از کد زیر استفاده کنید.
1 2 3 4 5 6 | // Query task with urls RxDownloadRecorder.getTaskList("url1","url2","url3") .observeOn(AndroidSchedulers.mainThread()) .subscribeBy { list -> // list of TaskEntity } |
برای اینکه لیسیت فایل های دانلود شده را به دست آورید
1 2 3 4 5 | RxDownloadRecorder.getAllTask() .observeOn(AndroidSchedulers.mainThread()) .subscribeBy { list -> //list of TaskEntity } |
دریافت تعداد فایل های دانلودی به صورت صفحه به صفحه
1 2 3 4 5 | RxDownloadRecorder.getTaskList(page, pageSize) .observeOn(AndroidSchedulers.mainThread()) .subscribeBy { list -> //list of TaskEntity } |
برای شروع دانلود فایل در حالت لیستی از فایل ها از کد زیر برای شروع دانلود استفاده کنید.
1 | RxDownloadRecorder.startAll() |
متوقف کردن
1 | RxDownloadRecorder.stopAll() |
حذف کردن
1 | RxDownloadRecorder.deleteAll() |
یک مثال کامل برای دوستانی که نمی توانند از syntax استفاده کنند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | 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) } } } |
موفق و پیروز باشید.