2017-11-10 11 views
0

断片では、私はダウンロードコードを持っています。私は他の部分でもダウンロード機能が必要であると確信しています。Androidのコールバックとコードの再利用

私はそれをフラグメントからライブラリとして別のファイルにしたいが、コードにはアクティビティにスタックされたいくつかのアンドロイドコールバックメソッドが含まれていて、別のファイルに移動するとそのハンドリング方法はわかりませんクラス)。

フラグメントでダウンロードコード、

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クラスに移動することができますそれは再利用可能なものですか?

答えて

0

各フラグメントは、自身のライフサイクルコールバックを実装するためにはが必要ですが、コールバックはオブジェクトのインスタンスのメソッドに単純に委譲できます。上記のコードでは例えば

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

をも実装することの冗長性を除去完了する唯一の方法サブクラスをサブクラス化し、サブクラス内のオーバーライドで自分のメソッドにコールを追加することになりますが、そうしたくはありません。

関連する問題