我有ListView显示从服务器下载的图像。我需要执行的步骤是:
前4个步骤需要在后台线程中执行,以保持主线程未被占用,以便用户可以在后台下载图像时平滑地滚动列表。需要在UI线程上执行第5步。
我在后台执行这些步骤时遇到了麻烦。
这是我在从图像下载api获得成功响应后尝试在后台执行上述4个步骤的方法。
Thread thread = new Thread(new Runnable() {
public void run() {
try {
// Get bytes from Response
byte[] bytes = getBytesFromStream(response.getBody().in());
// Save bytes in phone sd card
saveBytesToFile(bytes, photoPath);
} catch (Exception e) {
e.printStackTrace();
} finally {
// Get bitmap from path
Bitmap webBitmap = getBitmap(photoPath);
// Show bitmap
showBitmap(webBitmap);
}
}
});
thread.start();
private void showBitmap(Bitmap bitmap) {
BitmapDisplayer bd = new BitmapDisplayer(bitmap, photoToLoad);
Activity a = (Activity) photoToLoad.imageView.getContext();
a.runOnUiThread(bd);
}
getBytesFromStream()方法从流中提取字节并返回它们。 saveBytesToFile()方法将这些字节保存在File对象(SD卡)中。 getBitmap()方法从特定路径获取位图。 showBitmap()方法在ImageView上显示位图。
现在我的问题是:
我做得对吗?
在Android中后台线程中执行某些操作的最佳方法是什么?
我认为上面的代码仍然阻塞主线程,因此我无法顺利滚动列表。如何正确执行这些步骤?
请帮帮我。
答案 0 :(得分:0)
请改用Picasso。在listview的适配器中执行以下操作:
@Override
public void getView(int position, View convertView, ViewGroup parent) {
//
// Other codes
//
Picasso.with(context).load(string_url).into(imageview);
}
答案 1 :(得分:0)
Thread
是可以的,但是当您需要经常进行后台工作时,您可能需要尝试一些线程策略,例如Executor来重用线程。