【发布时间】:2020-09-17 09:24:34
【问题描述】:
假设我有一个存储库类,它定义了一个从 Firebase 存储中检索图像的方法,并定义了一个成功侦听器,该侦听器调用从视图模型定义的回调
fun getAdImg(imgId: String, callback: (stream: Bitmap?) -> Unit) {
storage.child(FOLDER).child(imgId+EXTENSION).stream
.addOnSuccessListener {
callback(BitmapFactory.decodeStream(it.stream))
Log.i(TAG, "getAdImg success")
}
.addOnCanceledListener {
Log.e(TAG, "getAdImg canceled")
}
.addOnFailureListener {
Log.e(TAG, "getAdImg failure")
}
}
视图模型中定义回调并调用存储库的函数如下
fun loadImage(imgId: String?) {
imgId?.let { id ->
if (_img.value == null) {
viewModelScope.launch (context = IO) {
AdvertisementRepository.getInstance().getAdImg(id) { bitmap ->
_img.postValue(bitmap)
}
}
}
}
}
我有几个问题:
- 存储库类中
addOnSuccessListener定义的监听器的生命周期是什么? - 在侦听器中调用
callback函数的范围是什么? - 当我尝试运行此代码时,
BitmapFactory.decodeStream(it.stream)将抛出一个android.os.NetworkOnMainThreadException,由于调用decodeStream函数的上下文,这似乎是一个异常
【问题讨论】:
标签: android multithreading kotlin firebase-storage coroutine