我正在努力理解高阶函数以及如何使用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)
}
Run Code Online (Sandbox Code Playgroud)
我用这种方式调用上面的方法:
mGameService.addOnSearchGameResultListener(
this,
releaseThread(),
showNoResultsFoundMessage(),
updateSearchResults(null)
)
Run Code Online (Sandbox Code Playgroud)
并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()
}
}
Run Code Online (Sandbox Code Playgroud)
我知道当我声明它时(因为我需要在编译时传递一些东西),我将null传递给func,但是,从内部进行的调用addOnSearchGameResultListener()不会从运行时传递参数,我的意思是,addOnSearchGameResultListener()我总是得到null结果.这究竟是如何运作的,我做错了什么?
results我认为这种混乱尤其来自于参数名称。要解决该问题,您可以将其更改updateSearchResults为 ie:
private fun updateSearchResults() : (List<Game>?) -> Unit = { results ->
if (null != results && results.size > 0) {
mLastMatchingQuery = query_container.text.toString()
hideNoResultsFoundMessage()
mGames = results
mAdapter!!.dataSet = results.toMutableList()
} else {
showNoResultsFoundMessage()
}
}
Run Code Online (Sandbox Code Playgroud)
不过,我确实认为如果您应用以下更改,那么遵循代码会更容易:
制作updateSearchResults常规方法:
private fun updateSearchResults (results : List<Game>?) {
if (null != results && results.size > 0) {
mLastMatchingQuery = query_container.text.toString()
hideNoResultsFoundMessage()
mGames = results
mAdapter!!.dataSet = results.toMutableList()
} else {
showNoResultsFoundMessage()
}
}
Run Code Online (Sandbox Code Playgroud)更改addOnSearchGameResultListener调用并传递 lambda
mGameService.addOnSearchGameResultListener(
this,
releaseThread(),
showNoResultsFoundMessage(),
{ updateSearchResults(it) }
)
Run Code Online (Sandbox Code Playgroud)应用类似的更改releaseThread,showNoResultsFoundMessage
| 归档时间: |
|
| 查看次数: |
598 次 |
| 最近记录: |