我正在启动一个异步函数来获取StorageReference
,从中获取StreamDownloadTask
,并尝试从其Bitmap
中创建InputStream
userRepository.getUserImg(id).stream
.addOnSuccessListener { // StreamDownloadTask.TaskSnapshot!
val picture = BitmapFactory.decodeStream(it.stream) // it.stream reported to return an InputStream
user.value!!.img = picture
}
.addOnFailureListener { exception ->
Log.e(TAG, exception.toString())
}
但是,当我启动此功能时,出现此错误:
W/System.err: android.os.NetworkOnMainThreadException
W/System.err: at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1565)
at com.google.android.gms.org.conscrypt.Platform.blockGuardOnNetwork(:com.google.android.gms@200414022@20.04.14 (040700-294335909):0)
at com.google.android.gms.org.conscrypt.ConscryptFileDescriptorSocket$SSLInputStream.read(:com.google.android.gms@200414022@20.04.14 (040700-294335909):2)
at com.android.okhttp.okio.Okio$2.read(Okio.java:138)
at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:213)
at com.android.okhttp.okio.RealBufferedSource.read(RealBufferedSource.java:51)
at com.android.okhttp.internal.http.Http1xStream$FixedLengthSource.read(Http1xStream.java:395)
W/System.err: at com.android.okhttp.okio.RealBufferedSource$1.read(RealBufferedSource.java:372)
at com.google.firebase.storage.StreamDownloadTask$StreamProgressWrapper.read(com.google.firebase:firebase-storage@@19.1.1:408)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:248)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:288)
at java.io.BufferedInputStream.read(BufferedInputStream.java:347)
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:790)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:765)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:806)
at it.polito.phony.lab3.user.profile.ShowProfileViewModel$loadUser$4.onSuccess(ShowProfileViewModel.kt:49)
at it.polito.phony.lab3.user.profile.ShowProfileViewModel$loadUser$4.onSuccess(ShowProfileViewModel.kt:18)
at com.google.firebase.storage.StorageTask.lambda$new$0(com.google.firebase:firebase-storage@@19.1.1:123)
at com.google.firebase.storage.StorageTask$$Lambda$1.raise(Unknown Source:6)
at com.google.firebase.storage.TaskListenerImpl.lambda$onInternalStateChanged$2(com.google.firebase:firebase-storage@@19.1.1:90)
at com.google.firebase.storage.TaskListenerImpl$$Lambda$3.run(Unknown Source:6)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
我还尝试通过从Bitmap
获取ByteArray
来获取StorageReference
,但是BitmapFactory
无法创建Bitmap
,因为它根据我的理解,我希望收到一个byte[]
而不是ByteArray
作为参数。
答案 0 :(得分:0)
一旦我使用 piccasso 完成了以下操作(假设您知道如何从firebase获取图像uri,请告诉我是否也需要该代码)
Thread thread = new Thread() {
public void run() {
try {
Bitmap bitmap = Picasso.with(getActivity())
.load(uri).get();
} catch (Exception e) {
e.printStackTrace();
}
}
};
thread.start();
})
由于某些原因,无法在主线程上调用get()
方法
安东尼奥·桑托罗(Antonio Santoro)有美好的一天
答案 1 :(得分:0)
我不知道MVVM方法,但是它可能会给您一个解决方案,可以解决此问题。
您可以尝试以下方法:
Glide.with(getApplicationContext()).asBitmap().load(imgUrl).into(new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
img_icon.setImageBitmap(resource);
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});