gpt4 book ai didi

android - 在 kotlin 中创建通用的高阶函数

转载 作者:行者123 更新时间:2023-12-02 12:51:38 25 4
gpt4 key购买 nike

我有一个接口(interface)GalleryImagesDataCallback我用来将数据从后台线程传递到 UI 线程,以避免调用 runOnUiThread()来自 GalleryImagesDataCallback 的每个被覆盖的方法,我用过kotlin高阶函数。

interface GalleryImagesDataCallback {

fun fetchedList(list: ArrayList<ImageGalleryItemModel>)

@JvmDefault
fun callMethodOnUIThreadForFetch(mContext: Context, list:ArrayList<ImageGalleryItemModel>,func: (ArrayList<ImageGalleryItemModel>) -> Unit) {
(mContext as BaseActivity).runOnUiThread {
Logger.error("TEST_ABC","callMethodOnUIThreadForFetch Enter")
func(list)
}
}

fun deleteList()

@JvmDefault
fun callMethodOnUIThreadForDelete(mContext: Context, func: () -> Unit) {
(mContext as BaseActivity).runOnUiThread {
Logger.error("TEST_ABC","callMethodOnUIThreadForDelete Enter")
func()
}
}

}

从后台线程调用:
callback.callMethodOnUIThreadForFetch(mContext,list) {list:ArrayList<ImageGalleryItemModel> -> callback.fetchedList(list)}  // callback is reference of GalleryImagesDataCallback

callback.callMethodOnUIThreadForDelete(mContext) {callback.deleteList()}

问题:

现在我有 2 种不同的方法 callMethodOnUIThreadForDelete()callMethodOnUIThreadForFetch() .在 kotlin 中有什么方法可以创建一种我可以的通用方法(比如 callMethodOnUIThread() )
用于调用 deleteList()fetchedList()两者都没有改变功能定义?

最佳答案

首先回答您的字面问题,您的callMethodOnUIThreadForFetch函数对 list 进行了不必要的重定向争论。为什么将列表作为高阶函数的参数只是为了将其直接传递回函数参数?您可以使用您的 callMethodOnUIThreadForDelete用于任一目的的函数,但假设我们重命名它并使用 Handler 删除对 Activity 的不安全强制转换:

// In interface:
fun callMethodOnUIThread(context: Context, func: () -> Unit) {
Handler(context.mainLooper).post(func)
}

// From background thread:
callback.callMethodOnUIThread(mContext) { callback.fetchedList(list) }
callback.callMethodOnUIThread(mContext) { callback.deleteList() }

假设你想简化实现这个接口(interface)的工作,那么我认为这实际上并没有帮助。您已将 UI 线程上调用代码的工作从接口(interface)实现推送到接口(interface)的用户。你也可以创建一个全局辅助函数,而不是把你的界面弄得乱七八糟,这对它来说是一个奇怪的地方。用法变得更加简单:
// Global utility function, not in a class
fun Context.onUiThread(func: () -> Unit) {
Handler(mainLooper).post(func)
}

// Usage:
mContext.onUiThread { callback.fetchedList(list) }
mContext.onUiThread { callback.deleteList() }

如果您真的想完全封装线程切换,则必须将接口(interface)更改为这样的抽象类:
abstract class GalleryImagesDataCallback {
protected abstract fun fetchedListImpl(list: List<String>)
protected abstract fun deleteListImpl()

fun fetchedList(context: Context, list: List<String>) {
Handler(context.mainLooper).post { fetchListImpl(list) }
}

fun deleteList(context: Context) {
Handler(context.mainLooper).post { deleteListImpl() }
}
}

因此,您将创建 this 的子类并实现两个抽象函数,而不是实现接口(interface)。回调的子类或用户都不必关心确保在 UI 线程上调用代码。

关于android - 在 kotlin 中创建通用的高阶函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60634931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com