【发布时间】:2016-07-07 02:36:51
【问题描述】:
我很难理解高阶函数以及如何使用 Kotlin 将函数作为参数传递给其他函数。我有一个我想完成的基本示例:
fun addOnSearchGameResultListener(
activity: AppCompatActivity,
releaseThread: () -> Unit,
showNoResultsFoundMessage: () -> Unit,
updateSearchResults: (result: List<Game>) -> Unit) {
var event0017Handler: TaskExecutor = object : TaskExecutor {
override fun executeOnSuccessTask(response: JSONObject) {
async() {
uiThread {
try {
releaseThread()
mLoaderManager.hideIndeterminateProgressBar(activity)
val result = mJSONParser.getGamesByGameKey(response)
Log.i(GameController::class.simpleName, "response: ${result.toString()}")
updateSearchResults(result)
} catch (e: JSONException) {
showNoResultsFoundMessage()
}
}
}
}
override fun executeOnErrorTask(payload: JSONObject) {
releaseThread()
mNotificationManager.showErrorPopUp(activity, payload.getString("data"))
}
}
NotificationCenter.RegistrationCenter.registerForEvent(EventCatalog.e0017, event0017Handler)
}
我是这样调用上面的方法的:
mGameService.addOnSearchGameResultListener(
this,
releaseThread(),
showNoResultsFoundMessage(),
updateSearchResults(null)
)
而updateSearchResults(null) 被声明为:
private fun updateSearchResults (results : List<Game>?) : (results : List<Game>?) -> Unit = {
if (null != results && results.size > 0) {
mLastMatchingQuery = query_container.text.toString()
hideNoResultsFoundMessage()
mGames = results
mAdapter!!.dataSet = results.toMutableList()
} else {
showNoResultsFoundMessage()
}
}
我知道我在声明它时将 null 传递给了 func(因为我需要在编译时传递一些东西),但是,从 addOnSearchGameResultListener() 内部进行的调用不是从运行时传递参数的,我的意思是,在addOnSearchGameResultListener() 中,我总是得到 null 的结果。这到底是如何工作的,我做错了什么?
【问题讨论】: