Сначала, чтобы ответить на ваш буквальный вопрос, ваша функция callMethodOnUIThreadForFetch
имеет ненужное перенаправление аргумента list
. Зачем делать список аргументом функции высшего порядка только для того, чтобы передать его обратно в аргумент функции? Вы можете использовать вашу функцию callMethodOnUIThreadForDelete
для любой цели, но предположим, что мы переименовали ее и удалили небезопасное приведение к 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() }
Предполагая, что вы хотите упростить работу по реализации этого интерфейса тогда я не думаю, что это действительно помогает. Вы перенесли работу по вызову кода в потоке пользовательского интерфейса из реализации интерфейса в пользователя интерфейса. Вы также можете создать глобальную вспомогательную функцию вместо того, чтобы загромождать ваш интерфейс, что является странным местом для этого. Использование становится более простым:
// 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() }
Если вы действительно хотите полностью инкапсулировать переключение потоков, вам придется изменить свой интерфейс на абстрактный класс, например:
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() }
}
}
Вместо этого реализации интерфейса, вы должны создать его подклассы и реализовать две абстрактные функции. Ни подкласс, ни пользователь обратного вызова не должны заботиться о том, чтобы код вызывался в потоке пользовательского интерфейса.