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!

  • ¿Es posible iniciar una variable en el cuerpo de la condición while para Kotlin?
  • ¿Puede una interfaz de kotlin almacenar en caching un valor?
  • Implementación de interfaz de retorno con Kotlin y lambda
  • Comience la actividad de kotlin * .kt desde la actividad de java * .java?
  • Referencia no resuelta: createPrintDocumentAdapter (Kotlin + Android)
  • Se deben declarar las funciones locales de Kotlin antes del uso
  • IllegalArgumentException: el parámetro especificado como no nulo es nulo
  • El depurador Java seleccionado actualmente no admite puntos de interrupción de tipo 'Kotlin Line Breakpoints'
  • Obtener error de instancia en kotlin: conversión inteligente a 'tipo' es imposible
  • Kotlin Coroutines el path correcto en Android
  • Async no espera a la espera