0

ここAndroid Smooth Scrolling の指示に従ってスムーズなスクロールを実現していますが、onPostExecute のメソッド setImageBitmap はまだリストビューをフリーズしています。ここで非同期タスクのコード

private static class ThumbnailTask extends AsyncTask<Integer, Void, Bitmap> {
    private final WeakReference<ImageView> imageViewReference;

    public ThumbnailTask(ImageView imageView) {

        imageViewReference = new WeakReference<ImageView>(imageView);
    }

    @Override
    protected Bitmap doInBackground(Integer... params) {

        Bitmap image =  fragment.getAlbum().getPhotos().get(params[0]).getImage(Utils.THUMBNAIL_SCREEN_SIZE);
        return ThumbnailUtils.extractThumbnail(image, 40, 40);
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (isCancelled()) {
            bitmap = null;
        }

        if (imageViewReference != null) {
            ImageView imageView = imageViewReference.get();
            if (imageView != null) {
                imageView.setImageBitmap(bitmap);
            }
        }
    }




}

そして、これが getView メソッドでの使用方法です

 new ThumbnailTask(holder.image).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, position);

長いプロセスは doInBackground メソッドからの「getImage」であり、onPostExecute の ImageView に画像を配置しているだけです。setImageBitmap にコメントを付けると、スクロールが再びスムーズになります。私が間違っていることは何ですか?

4

1 に答える 1

0

非同期タスクに get() が必要だと思います。次の行をコメントアウトすると、get の悪影響が見られないと思います。

imageView.setImageBitmap(bitmap);

しかし、それは問題ではありません。

私はこれをお勧めします:

private static class ThumbnailTask extends AsyncTask<Integer, Void, Bitmap> {
    private final WeakReference<ImageView> imageViewReference;
    private final ImageView yourImageView = null;
    public ThumbnailTask(ImageView imageView) {

        imageViewReference = new WeakReference<ImageView>(imageView);
    }

    @Override
    protected Bitmap doInBackground(Integer... params) {

        Bitmap image =  fragment.getAlbum().getPhotos().get(params[0]).getImage(Utils.THUMBNAIL_SCREEN_SIZE);
        return ThumbnailUtils.extractThumbnail(image, 40, 40);
        if (imageViewReference != null) {
            yourImageView = imageViewReference.get();
        }
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (isCancelled()) {
            bitmap = null;
        }

        if (imageView != null) {
            imageView.setImageBitmap(bitmap);
        }
    }
}
于 2013-07-29T05:47:04.507 に答える