【发布时间】:2015-01-08 00:21:52
【问题描述】:
我正在从 parse.com 下载 Parse 数据字段并异步调整每个字段中包含的图像的大小。当视图膨胀时,图像的第一页不会调整大小。当视图被回收时,它们会正确显示。
我首先尝试在GetDataCallback 的done 部分调整图像大小并看到大图。接下来,我自己实现了线程,结果相同:图像的第一屏最初显示不正确,但当它们离开屏幕并返回时修复。
作为测试,我接下来尝试直接获取数据(不是getDataInBackground)并调整大小,效果很好,但显然处理时间增加了。由于此测试,我认为该问题与线程有关。
一些代码:
@Override
public void done(List<Listing> listingList, ParseException e) {
/* scale and save the image back to parse object */
final float scale = getResources().getDisplayMetrics().density;
if (e == null) {
Log.d("listing", "Retrieved " + listingList.size() + " listings");
/* clear adapter before populating */
adapter.clear();
/* iterate through listings and create listing objects */
for (Listing listingObject : listingList) {
//listingObject.resizeImage(scale);
new ResizeImages().execute(listingObject);
listings.add(listingObject);
}
}
else {
Log.d("listing", "Error: " + e.getMessage());
}
}
});
异步调整大小:
private class ResizeImages extends AsyncTask<Listing, Void, Listing> {
protected Listing doInBackground(Listing... params) {
Listing listing = params[0];
final float scale = getResources().getDisplayMetrics().density;
try {
byte[] data = listing.getFile().getData();
/* Decode the byte array into BitMap to be displayed on device */
Bitmap bitmap = BitmapFactory
.decodeByteArray(
data, 0,
data.length);
/* scale image and put back into parse object */
if (scale <= 1.0) {
bitmap = Bitmap.createScaledBitmap(bitmap, 134, 134, false);
} else if (scale <= 1.5) {
bitmap = Bitmap.createScaledBitmap(bitmap, 200, 200, false);
}
...
/* put image back into byte data and put back in "this" */
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] scaledData = stream.toByteArray();
bitmap.recycle();
Log.d("Resizer", "Image resized.");
ParseFile photoFile = new ParseFile("image.jpeg", scaledData);
listing.setFile(photoFile);
} catch (ParseException e) {
e.printStackTrace();
}
return listing;
}
protected void onPostExecute(Listing listing) {
Log.d("Resizer: ", "Resizing done");
}
}
编辑
我的修复涉及将 `onPostExecute' 更改为:
protected void onPostExecute(Listing listing) {
Log.d("Resizer: ", "Resizing done");
listings.add(listing); // this line from UI thread moved here
adapter.notifyDataSetChanged(); // this line was new
}
我在下面的答案中提供了一种更通用的方法来异步调整位图大小。
【问题讨论】:
标签: bitmap android-asynctask parse-platform android-imageview image-resizing