打电话是不好的做法
getResources().getDrawable()
或者BitmapFactory.decodeResource()
来自Android上的UI线程?我只是想知道,因为我有这种情况,我想在执行后台操作时在我的视图中显示一个加载图像,但我仍然调用上述方法之一......几乎我看到的每个项目似乎都在执行任何线程上的任何一种方法都没有经过深思熟虑,但我只是在寻找最佳实践。
打电话是不好的做法
getResources().getDrawable()
或者BitmapFactory.decodeResource()
来自Android上的UI线程?我只是想知道,因为我有这种情况,我想在执行后台操作时在我的视图中显示一个加载图像,但我仍然调用上述方法之一......几乎我看到的每个项目似乎都在执行任何线程上的任何一种方法都没有经过深思熟虑,但我只是在寻找最佳实践。
自从我提出这个问题以来,快进 3 年了,我认为简短的回答是“只需使用 Picasso 或 Glide”。我认为长答案是“这取决于”。这取决于 Image/drawable 的大小。对于BitmapFactory#decodeResource
,您应该尽一切可能远离主线程。如果我尝试显示占位符图像,最佳做法是它应该以适合您的设计的合理大小打包在您的应用程序中。
如果您在 UI 线程上进行任何 GUI 更新,这将是一个很好的做法。在任何线程中,您都可以运行您的 UI 线程,您可以在其中执行 UI 工作,或者您也可以使用消息处理程序,它也会为您做同样的事情。
Runnable run_in_ui = new Runnable() {
@Override
public void run() {
// do your UI stuffs here
}
};
runOnUiThread(run_in_ui);
尽管 Vijay Sharma 建议使用 Picasso,但我建议您使用 Facebook 的 frescolib。它做了所有可能的优化,从硬件缓存开始,最终用流水线概念修改 Http 请求。
与其自己做,还不如依靠 Facebook 团队的工作:
构建.gradle:
dependencies {
// your app's other dependencies
compile 'com.facebook.fresco:fresco:0.7.0+'
}
视图.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 -->
爪哇:
mSimpleDraweeView.setImageURI(uri);
就这么简单!