gpt4 book ai didi

android - 用 setImageBitmap 替换对 setImageResource() 的调用以减少打嗝?

转载 作者:行者123 更新时间:2023-11-29 15:21:53 28 4
gpt4 key购买 nike

Android 的 setImageResource() documentation状态:

This does Bitmap reading and decoding on the UI thread, which can cause a latency hiccup. If that's a concern, consider using setImageDrawable(android.graphics.drawable.Drawable) or setImageBitmap(android.graphics.Bitmap) and BitmapFactory instead.

我希望在我的示例应用程序中解决这个确切的问题。我想我应该在这里“读懂字里行间”并替换我的电话:

((ImageView) rootView.findViewById(R.id.screen_image)).setImageResource(imageId);

改为调用

InputStream is = this.getResources().openRawResource(imageId);
Bitmap imageBitmap = BitmapFactory.decodeStream(is);
((ImageView) rootView.findViewById(R.id.screen_image)).setImageBitmap(imageBitmap);

但在另一个线程中执行此操作,方法是使用类似 AsyncTask 的东西 -

我的理解是否正确,或者是否有更简单的解决方案?

更新:

displaying bitmaps efficiently 上好像有一整节在 developer.android.com - 我现在正在调查。

最佳答案

解决此问题的最简单方法是创建一个 worker thread如线程和进程文档中所述。正如它所提到的,异步任务可用于替换它以获得更复杂的代码。最终的解决方案是在 OnCreateView() 方法中更改我的代码,替换原来的滞后代码:

 final View rootView = inflater.inflate(R.layout.fragment_screen, container, false);
int i = getArguments().getInt(ARG_PANEL_NUMBER);
String panel = getResources().getStringArray(R.array.panel_array)[i];
int imageId = getResources().getIdentifier(panel.toLowerCase(Locale.getDefault()),
"drawable", getActivity().getPackageName());

((ImageView) rootView.findViewById(R.id.screen_image)).setImageDrawable(getResources().getDrawable(imageId));

有一个新的后台线程:

final View rootView = inflater.inflate(R.layout.fragment_screen, container, false);

// Load image in a separate thread to ensure navigation drawer animation is smooth.
// Replace with Async Task if necessary
new Thread(new Runnable() {
public void run() {
int i = getArguments().getInt(ARG_PANEL_NUMBER);
final String panel = getResources().getStringArray(R.array.panel_array)[i];

int imageId = getResources().getIdentifier(panel.toLowerCase(Locale.getDefault()),
"drawable", getActivity().getPackageName());

InputStream is = getActivity().getResources().openRawResource(imageId);
final Bitmap imageBitmap = BitmapFactory.decodeStream(is);
rootView.post( new Runnable() {
public void run() {
((ImageView) rootView.findViewById(R.id.screen_image)).setImageBitmap(imageBitmap);
getActivity().setTitle(panel);
}
});
}

}).start();

如上述文档所述,如果此代码变得太大,则使用异步任务更具可扩展性和可维护性。

关于android - 用 setImageBitmap 替换对 setImageResource() 的调用以减少打嗝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17604423/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com