Devoluciones de llamada de Android y reutilización de código

En un fragment, tengo un código de descarga. y estoy seguro de que también necesito la function de descarga en los otros fragments.

Así que quiero separar el file como una biblioteca del fragment, pero el código contiene algunos methods de callback de Android que se astackn en la Actividad y no sé cómo manejarlo si lo muevo a otro file (Clase).

El código de descarga en el fragment,

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) } 

y los methods de callback son

onRequestPermissionsResult

onDownloadComplete

¿Cómo puedo moverlos a la class MediaDownload para que sea reutilizable?

Cada Fragmento necesita implementar su propia callback del ciclo de vida, pero esa callback puede simplemente delegar a un método en una instancia de un object.

Por ejemplo en tu código de arriba:

 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() } 

Debería mover el método beforeDownload () a alguna class de "model", crear o inyectar una instancia y luego llamar al método beforeDownload() en esa instancia.

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

Cada Fragmento aún necesita el método del ciclo de vida, pero la parte principal del código se puede compartir en la class SomeModel

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

La única manera de completar la eliminación de la networkingundancia de tener que implementar incluso el método del ciclo de vida mínimo, sería subclasificar el Fragmento y agregar la llamada a su método en la anulación en la subclass, ¡pero no quiere hacer eso!

  • ¿Cuál es el propósito de que la reference de class enlazada devuelva un tipo covariante?
  • El método RXjava2 en fromCallable no se puede exceder
  • ¿Cómo get "key" a muchos niños desconocidos en Firebase?
  • Escritura simple para loop en 1 línea en Kotlin
  • Usar el object compañero para devolver una instancia de la class en Kotlin
  • ¿Cómo declaro una variable de tipo enum en Kotlin?
  • Barra de navigation inferior "Fantasma" cuando el fragment se carga en la actividad del hogar
  • Dagger2 inyecta un presentador en un error de actividad de Kotlin
  • Usar interfaces funcionales con types de funciones en Kotlin
  • Java genérico para Kotlin genérico. Retorno genérico del método
  • La información no se carga correctamente en Firebase-Firerestre