0

再び「奇妙な」問題に直面しています。

Viewpagerを使用して2つの個別の画像を表示しています(Viewpagerにはレイアウトと2つの画像ビューのみが含まれています)。コンセプトは、ローカルファイルキャッシュから低解像度の画像を(すぐに)表示し、その間に高解像度の画像をロードして表示することです。

問題は、低解像度の写真のみを使用すると、写真はすぐに表示され、すべてが完璧ですが、高解像度の写真が有効になるとすぐに(表示されるようになります)、ユーザーが非常に速くスワイプすると、画面が「短時間」黒いままになります" (500 ミリ秒から 1.5 秒) および低解像度の画像は表示されません。高解像度の写真だけ..

たぶん、誰もが同様の問題に直面しました。

ViewPager コード:

/**
 * Create and add a new page of the image at the given position.
 * 
 * @param collection
 * @param position
 */
@Override
public Object instantiateItem (View collection, final int position) {

    Log.v(TAG, "instantiateItem: pos: " +position);

    final Context context = collection.getContext();


    RelativeLayout layout = new RelativeLayout(context);
    ImageViewTouch imageView = new ImageViewTouch(context);
    ImageViewTouch imageView2 = new ImageViewTouch(context);
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT);

    layout.addView(imageView, lp);        
    layout.addView(imageView2, lp);

    imageView.setOnSingleTapConfirmedListener((OnImageViewSingleTapConfirmedListener) context);
    imageView2.setOnSingleTapConfirmedListener((OnImageViewSingleTapConfirmedListener) context);
    imageView2.setVisibility(View.GONE);

    if (position == restorePageNumber) {
        loadBitmap(context, position, imageView, imageView2, restoreZoomLevel);

        Log.w(TAG, "zoom level regocnized for pos: " + position + " resetting...");
        restorePageNumber = Constants.INVALID_INT;
        restoreZoomLevel = Constants.INVALID_LONG;          
    } else {
        loadBitmap(context, position, imageView, imageView2, Constants.INVALID_LONG);
    }

    imageView.setFitToScreen(true);
    imageView2.setFitToScreen(true);

    activePages.put(position, imageView2);
    ((ViewPager) collection).addView(layout);


    return layout;
}
protected void loadBitmap (Context context, int position, 
  ImageViewTouch imageView, ImageViewTouch imageView2, 
  float restoreZoomLevel) {
    Photo photo = getPhotoAtPosition(position);
    Log.v(TAG, "loading photo. pos: " + position + " id: " + photo.getId());
    // show small image first
    if (!(photo instanceof CameraPhoto)) {
        StorageManager.retrieveBitmapBackgroundWithImageview(context, photo,
                Photo.SIZE_SMALL, imageView, true, Constants.INVALID_LONG);
    }
    // afterwards replace with big image
    StorageManager.retrieveBitmapBackgroundWithImageview(context, photo,
            Photo.SIZE_LARGE, imageView2, true, restoreZoomLevel);
}

これらのメソッド (retrieveBitmapBackgroundWithImageview) では、画像は Background に読み込まれ、その後 imageview に設定されます。

大きなビットマップの設定に問題があるようです。大きなビットマップを含む Imageview が非表示 (View.GONE) のままで、ローカル キャッシュ イメージのみが表示されている場合でも、ViewPager はページの読み込み時に一定の「時間」(上記のように 500 ミリ秒から 1.5 秒) の間、黒のままです。 )

どうも :)

4

1 に答える 1

0

多くのページをすばやくスワイプすることを意味する場合は、それらすべてのビューの読み込みに問題があります。ViewPager範囲外(ビューまたはキャッシュ外) の loadBitmap タスクをキャンセルまたは中断しますか?

また、スレッドで並行処理を行っていますか? ビューまたはキャッシュにあるページを常に最初にロードしたい場合は、ViewPager'sオーバーライドComparatorしてページで比較できるようにする必要があります。コンパレータは で使用できます で使用PriorityBlockingQueueできますExecutor

于 2012-12-14T10:54:13.077 に答える