Обратные вызовы Android и повторное использование кода

Во фрагменте у меня есть код загрузки. и я уверен, что мне нужна функция загрузки и в других фрагментах.

Поэтому я хочу сделать его отдельным файлом в виде библиотеки из этого фрагмента, но код содержит некоторые методы обратного вызова android, которые сложены в Activity, и я не знаю, как его обрабатывать, если я переведу его в другой файл (класс).

Код загрузки в фрагменте,

private fun beforeDownload() { // check permission val externalPermission = ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) if (externalPermission != PackageManager.PERMISSION_GRANTED) { requestPermissions(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), REQUEST_ID_STORAGE_PERMISSION) } else { onDownload() } } /** Android call-back method after requesting permission **/ override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { beforeDownload() } private fun onDownload() { if (media >= 100000000) { Toast.makeText(activity, "The media is over 100Mb", Toast.LENGTH_SHORT).show() } else { downloadMediaJob = launch(UI) { downloadMedia() } } } // Android receiver when download completed private val onDownloadComplete = object : BroadcastReceiver() { override fun onReceive(p0: Context?, p1: Intent?) { Toast.makeText(activity, R.string.download_complete_msg, Toast.LENGTH_SHORT).show() } } suspend private fun downloadMedia() { downloadManager = context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager ... downloadedFileId = downloadManager.enqueue(request) } 

и методы обратного вызова

onRequestPermissionsResult

onDownloadComplete

Как я могу переместить их в класс MediaDownload, чтобы сделать его многоразовым?

Каждый фрагмент должен реализовать свой собственный обратный вызов жизненного цикла, но этот обратный вызов может просто делегировать метод на экземпляр объекта.

Например, в вашем коде выше:

 private fun beforeDownload() { // check permission val externalPermission = ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) if (externalPermission != PackageManager.PERMISSION_GRANTED) { requestPermissions(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), REQUEST_ID_STORAGE_PERMISSION) } else { onDownload() } } /** Android call-back method after requesting permission **/ override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { beforeDownload() } 

Вам нужно просто перенести метод beforeDownload () в какой-нибудь «модельный» класс, создать или ввести экземпляр, а затем вызвать метод beforeDownload() в этом экземпляре.

 class SomeModel() { fun beforeDownload() { ... } } 

Каждый фрагмент по-прежнему нуждается в методе жизненного цикла, но основную часть кода можно использовать в классе SomeModel

 override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { instanceOfSomeModel.beforeDownload() } 

Единственный способ завершить удаление избыточности при необходимости реализовать даже минимальный метод жизненного цикла – это подкласс Fragment и добавить вызов вашего метода в переопределение в подклассе, но вы не хотите этого делать!

Intereting Posts
В kotlin, Когда я перегружаю оператор inc (), я получаю ошибку kotlin, вызывающий мутирующую функцию в делеризации класса Android посыльный – писать с нулевым длинным Gradle KTS. Как переместить конфигурацию зависимостей в отдельный файл из основной сборки? Главная Ui Freezes Претендент свойства lateinit не был инициализирован с помощью EasyMVP, Robolectric и Kotlin Ошибка преобразования Java-компонента с наследованием в Kotlin Использование Котлина с кинжалом Можно ли избежать повторения кода, когда объект должен вернуть измененную копию самого себя? Как я могу сделать параметр IntelliJ refactor-> rename только переименовать локальную версию? (Котлин) Невозможно скомпилировать проект с использованием Gradle и Kotlin Как я могу использовать kotlin-maven-plugin под jdk1.7? Не удалось получить данные из базы данных sqlite Как добавить контент из url-чтения в arraylist Почему интерфейс, написанный в Kotlin, исчезает после перезагрузки в Android Studio?