Android AsyncTask Listview problem
I have the below code in my getView. It populates an imageview with an image and it works but not without problems. Problem being that I don't see the image until I click something on the screen. Also if I have more than one image in the listview clicking something on screen will make the images shift around.
class Thumbnailer extends AsyncTask<S开发者_开发百科tring, Void, Bitmap> {
@Override
protected void onPostExecute(Bitmap result) {
image_main.setImageBitmap(result);
image_main.setVisibility(View.VISIBLE);
image_table.setVisibility(View.VISIBLE);
}
@Override
protected void onProgressUpdate(Void... progress) {
}
@Override
protected Bitmap doInBackground(String... params) {
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeFile(params[0], o);
final int REQUIRED_SIZE=70;
//Find the correct scale value. It should be the power of 2.
int width_tmp=o.outWidth, height_tmp=o.outHeight;
int scale=1;
while(true){
if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
break;
width_tmp/=2;
height_tmp/=2;
scale++;
}
//Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=scale;
return BitmapFactory.decodeFile(params[0], o2);
}
}
new Thumbnailer().execute(image);
i think that you cannot do any operation inside an AsyncTask subclass with any view that are attached to the ui, i think the best is to pass a handler to the Thumbnailer class via constructor and dispatch a message for update the image view on the ui thread. on the onPostExecute dispatch a message with the decoded bitmap within message.obj and set the ImageView bitmap on the handleMessage method.
As I wrote in your previous question: near as I can tell, you are attempting to load every image into a single ImageView
widget, which seems unlikely. You need to pass into the AsyncTask
the ImageView
for the row you are processing with this particular task.
How do I pass a View to Thumbnailer?
Supply it in the constructor, as Mr. Knego suggested.
Try passing a View
to your Thumbnailer
via a constructor, and then call view.invalidate()
as last line in onPostExecute
. This should force View
to redraw itself.
精彩评论