Android回调和代码重用

在一个片段中,我有一个下载代码。 而且我确定我也需要其他片段的下载功能。

所以我想把它作为一个单独的文件从一个库的片段,但代码包含一些堆叠在Activity上的android回调方法,我不知道如何处理它,如果我把它移动到另一个文件(Class)。

片段中的下载代码,

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()方法移动到某个“model”类,创建或注入一个实例,然后在该实例上调用beforeDownload()方法。

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

每个Fragment仍然需要生命周期方法,但是代码的主要部分可以在SomeModel类中共享

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

完成删除冗余的唯一方法就是实现最小生命周期方法,就是子类Fragment,并将你的方法调用添加到子类的override中,但是你不想这样做!