在Android中,您可以安全地在UI线程上调用“getDrawable”或“decodeResource”吗?

5

在Android中,在UI线程上调用getResources().getDrawable()BitmapFactory.decodeResource()是不良实践吗?我想知道这一点,因为我有这样的情况:当我执行后台操作时,我希望在视图中显示一个加载图像,但我仍然调用上述方法之一…几乎每个我看到的项目似乎都会在任何线程上执行其中的一个方法,但我只是寻找最佳实践。

3个回答

2

距离我提出这个问题已经过去了3年,我认为简短的答案是“只需使用Picasso或Glide”。我认为详细的答案是“这取决于情况”。它取决于图像/可绘制对象的大小。对于BitmapFactory#decodeResource,您应该尽可能避免在主线程上执行操作。如果我想要显示一个占位符图像,则最好的做法是将其与合理的大小打包到您的应用程序中,并与您的设计相适应。


0
虽然 Vijay Sharma 建议使用 Picasso,但我建议您使用 Facebook 的 frescolib 。它会从硬件缓存开始进行所有可能的优化,最终采用管线概念修改 Http 请求。
与其自己动手,不如信赖 Facebook 团队的工作:

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);

就是这么简单!


是的,Fresco也可以。我只是想表达,我认为使用库而不是自己编写代码是正确的选择。 - Vijay Sharma

0

如果您在UI线程上执行任何GUI更新,那将是一个很好的实践。在任何线程内部,您都可以运行您的UI线程,在那里您可以执行UI操作,或者您也可以选择消息处理程序,它也会为您执行相同的操作。

Runnable run_in_ui = new Runnable() {
        @Override
        public void run() {
            // do your UI stuffs here
        }
    };
    runOnUiThread(run_in_ui);

是的,我知道在UI线程上更新UI组件是最佳实践。我更想知道getDrawable()和decodeResource()是否被认为是UI线程上的"I/O"操作?或者它们是否应该始终在工作线程上完成? - Vijay Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接