在Android中,在UI线程上调用getResources().getDrawable()
或BitmapFactory.decodeResource()
是不良实践吗?我想知道这一点,因为我有这样的情况:当我执行后台操作时,我希望在视图中显示一个加载图像,但我仍然调用上述方法之一…几乎每个我看到的项目似乎都会在任何线程上执行其中的一个方法,但我只是寻找最佳实践。
在Android中,在UI线程上调用getResources().getDrawable()
或BitmapFactory.decodeResource()
是不良实践吗?我想知道这一点,因为我有这样的情况:当我执行后台操作时,我希望在视图中显示一个加载图像,但我仍然调用上述方法之一…几乎每个我看到的项目似乎都会在任何线程上执行其中的一个方法,但我只是寻找最佳实践。
距离我提出这个问题已经过去了3年,我认为简短的答案是“只需使用Picasso或Glide”。我认为详细的答案是“这取决于情况”。它取决于图像/可绘制对象的大小。对于BitmapFactory#decodeResource
,您应该尽可能避免在主线程上执行操作。如果我想要显示一个占位符图像,则最好的做法是将其与合理的大小打包到您的应用程序中,并与您的设计相适应。
build.gradle:
dependencies {
// your app's other dependencies
compile 'com.facebook.fresco:fresco:0.7.0+'
}
view.xml:
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/my_image_view"
android:layout_width="20dp"
android:layout_height="wrap_content"
fresco:viewAspectRatio="1.33"
<!-- other attributes -->
Java:
mSimpleDraweeView.setImageURI(uri);
就是这么简单!
如果您在UI线程上执行任何GUI更新,那将是一个很好的实践。在任何线程内部,您都可以运行您的UI线程,在那里您可以执行UI操作,或者您也可以选择消息处理程序,它也会为您执行相同的操作。
Runnable run_in_ui = new Runnable() {
@Override
public void run() {
// do your UI stuffs here
}
};
runOnUiThread(run_in_ui);