图像未加载到 Fresco 中

Images not loading in Fresco

我正在尝试加载 Fresco 中的图像,但图像似乎无法加载。当我添加占位符视图时,占位符显示。

public static void loadImg(final Context c, final SimpleDraweeView view, final String img){
    Uri uri = Uri.parse("https://placekitten.com/g/201/300");
    view.setImageURI(uri);
}

请注意,我正在应用程序中初始化 Fresco,并且我在清单中确实使用了互联网。

SimpleDraweeView

        <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/small_box_image"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        fresco:placeholderImage="@drawable/google"
        fresco:fadeDuration="300"
        fresco:viewAspectRatio="1.33"
        />

方法调用loadImg

public static View generateTileView(Context c, Tile t){

    LayoutInflater inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view;
    boolean desc = false;

    switch(t.getObjectTypeName()){
        case Tile.OBJECT_NAME:
            view = inflater.inflate(R.layout.view_tile_small_object, null);
            break;
        case Tile.LOOK_CLOSER_NAME:
            view = inflater.inflate(R.layout.view_tile_small_look_closer, null);
            desc = true;
            break;
        case Tile.STORY_NAME:
            view = inflater.inflate(R.layout.view_tile_small_story, null);
            desc = true;
            break;
        case Tile.TOUR_NAME:
            view = inflater.inflate(R.layout.view_tile_small_tour, null);
            desc = true;
            break;
        default:
            view = inflater.inflate(R.layout.view_tile_small_object, null);
            break;
    }

    TextView type = (TextView) view.findViewById(R.id.small_box_type);
    TextView title = (TextView) view.findViewById(R.id.small_box_title);
    SimpleDraweeView img = (SimpleDraweeView) view.findViewById(R.id.small_box_image);

    if(desc) {
        TextView descText = (TextView) view.findViewById(R.id.small_box_desc);
        if ( t.getDescription() != null) {
            descText.setText(t.getDescription());
            descText.setTypeface(TypefaceUtil.get(c, TypefaceUtil.ENZO_M));
        }else{
            descText.setVisibility(View.GONE);
        }
    }

    title.setText(t.getTitle());
    title.setTypeface(TypefaceUtil.get(c, TypefaceUtil.SOFIA_BOLD));
    type.setText(t.getObjectTypeName());
    type.setTypeface(TypefaceUtil.get(c, TypefaceUtil.SOFIA_BOLD));
    ViewUtils.loadImg(c, img, t.getImg());

    return view;
}



public static void injectTileViews(Context c, final OnFragmentChangeListener listener,
                        List<Tile> tiles, LinearLayout leftSide, LinearLayout rightSide){

    int index = 0;

    for(final Tile t : tiles){
        //Gets the views and the ImageView for the star
        View v = ViewUtils.generateTileView(c,t);
        if(!t.getObjectTypeName().equals(Tile.LOOK_CLOSER_NAME)) {
            final ImageView star = (ImageView) v.findViewById(R.id.tile_star);

            //Sets the favorite on click listener
            star.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String type = "";
                    switch(t.getObjectTypeName()){
                        case Tile.OBJECT_NAME:
                            type = OnFragmentChangeListener.OBJECT;
                            break;
                        case Tile.STORY_NAME:
                            type = OnFragmentChangeListener.STORY;
                            break;
                        case Tile.TOUR_NAME:
                            type = OnFragmentChangeListener.TOUR;
                            break;
                    }
                    t.setFavorite(!t.getFavorite());
                    listener.onFavorite(type, t.getObjectID(), t.getFavorite());
                    star.setImageResource((t.getFavorite()) ? R.drawable.ic_grade : R.drawable.favorite_star);
                }
            });

            //sets the stat image based on whether it's favorite or no
            star.setImageResource((t.getFavorite()) ? R.drawable.ic_grade : R.drawable.favorite_star);
        }
        //sets the entire tile click listener
        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switch (t.getObjectTypeName()) {
                    case Tile.OBJECT_NAME:
                        listener.onFragmentChange(MainActivity.OBJECT, t.getObjectID());
                        break;
                    case Tile.TOUR_NAME:
                        listener.onFragmentChange(MainActivity.TOUR, t.getTourID());
                        break;
                    case Tile.STORY_NAME:
                        listener.onFragmentChange(MainActivity.STORY, t.getStoryID());
                        break;
                    case Tile.LOOK_CLOSER_NAME:
                        listener.onFragmentChange(MainActivity.LOOK_CLOSER, t.getObjectID());
                        break;
                }
            }
        });

        //invalidates the measurement
        leftSide.invalidate();
        rightSide.invalidate();
        //sets the measure spec
        final int widthMeasureSpec =
                View.MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.MATCH_PARENT,View.MeasureSpec.UNSPECIFIED);
        final int heightMeasureSpec =
                View.MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.WRAP_CONTENT, View.MeasureSpec.UNSPECIFIED);
        //re-measures
        leftSide.measure(widthMeasureSpec, heightMeasureSpec);
        rightSide.measure(widthMeasureSpec, heightMeasureSpec);
        int l = leftSide.getMeasuredHeight();
        int r = rightSide.getMeasuredHeight();

        //determines which side to add the view to
        if(l <= r){
            leftSide.addView(v);
        }else{
            rightSide.addView(v);
        }

        //sets the bottom margin since it needs to be part of the parent before we
        //can get the layout params
        LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) v.getLayoutParams();
        params.setMargins(0, 0, 0, (int) c.getResources().getDimension(R.dimen.margin_normal));
        v.setLayoutParams(params);
        v.requestLayout();

        //adds the index
        index++;
    }
}

正在初始化

public class MyApplication extends Application {

public static DisplayMetrics metrics;
private Typeface exoBlack;
private Tracker mTracker;

@Override
public void onCreate() {
    super.onCreate();

    LeakCanary.install(this);
    WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
    metrics = new DisplayMetrics();
    wm.getDefaultDisplay().getMetrics(metrics);
    Fresco.initialize(this);
}
}

示例日志

12-22 15:52:47.424 32462 32462 V unknown:AbstractDraweeController: controller 77d4657 null -> 0: initialize
12-22 15:52:47.425 32462 32462 V unknown:AbstractDraweeController: controller 77d4657 0: setHierarchy: com.facebook.drawee.generic.GenericDraweeHierarchy@a0fa544
12-22 15:52:47.435 32462 32462 V unknown:AbstractDraweeController: controller 3a5f0f3 null -> 1: initialize
12-22 15:52:47.435 32462 32462 V unknown:AbstractDraweeController: controller 3a5f0f3 1: setHierarchy: com.facebook.drawee.generic.GenericDraweeHierarchy@c03d1b0
12-22 15:52:47.442 32462 32462 V unknown:AbstractDraweeController: controller ef0f7ae null -> 2: initialize
12-22 15:52:47.442 32462 32462 V unknown:AbstractDraweeController: controller ef0f7ae 2: setHierarchy: com.facebook.drawee.generic.GenericDraweeHierarchy@6a4a94f
12-22 15:52:47.448 32462 32462 V unknown:AbstractDraweeController: controller 1cc58dc null -> 3: initialize
12-22 15:52:47.449 32462 32462 V unknown:AbstractDraweeController: controller 1cc58dc 3: setHierarchy: com.facebook.drawee.generic.GenericDraweeHierarchy@d3d0de5
12-22 15:52:47.455 32462 32462 V unknown:AbstractDraweeController: controller 158e0ba null -> 4: initialize
12-22 15:52:47.455 32462 32462 V unknown:AbstractDraweeController: controller 158e0ba 4: setHierarchy: com.facebook.drawee.generic.GenericDraweeHierarchy@12c8b6b
12-22 15:52:47.459 32462 32462 V unknown:AbstractDraweeController: controller 3a5f0f3 1: onAttach: request needs submit
12-22 15:52:47.463 32462 32462 V unknown:AbstractDraweeController: controller 3a5f0f3 1: submitRequest: dataSource: ab5a361
12-22 15:52:47.464 32462 32462 V unknown:AbstractDraweeController: controller 1cc58dc 3: onAttach: request needs submit
12-22 15:52:47.465 32462 32462 V unknown:AbstractDraweeController: controller 1cc58dc 3: submitRequest: dataSource: 5244e86
12-22 15:52:47.465 32462 32462 V unknown:AbstractDraweeController: controller 77d4657 0: onAttach: request needs submit
12-22 15:52:47.466 32462 32462 V unknown:AbstractDraweeController: controller 77d4657 0: submitRequest: dataSource: 2067347
12-22 15:52:47.466 32462 32462 V unknown:AbstractDraweeController: controller ef0f7ae 2: onAttach: request needs submit
12-22 15:52:47.467 32462 32462 V unknown:AbstractDraweeController: controller ef0f7ae 2: submitRequest: dataSource: 3c8e774
12-22 15:52:47.467 32462 32462 V unknown:AbstractDraweeController: controller 158e0ba 4: onAttach: request needs submit
12-22 15:52:47.468 32462 32462 V unknown:AbstractDraweeController: controller 158e0ba 4: submitRequest: dataSource: ac8149d
12-22 15:52:47.481 32462 32528 V unknown:BufferedDiskCache: Did not find image for https://placekitten.com/g/201/300 in staging area
12-22 15:52:47.481 32462 32528 V unknown:BufferedDiskCache: Disk cache read for https://placekitten.com/g/201/300
12-22 15:52:47.483 32462 32528 V unknown:BufferedDiskCache: Disk cache miss for https://placekitten.com/g/201/300
12-22 15:52:58.837   491   491 V unknown:AbstractDraweeController: controller 77d4657 null -> 0: initialize
12-22 15:52:58.837   491   491 V unknown:AbstractDraweeController: controller 77d4657 0: setHierarchy: com.facebook.drawee.generic.GenericDraweeHierarchy@a0fa544
12-22 15:52:58.847   491   491 V unknown:AbstractDraweeController: controller 3a5f0f3 null -> 1: initialize
12-22 15:52:58.848   491   491 V unknown:AbstractDraweeController: controller 3a5f0f3 1: setHierarchy: com.facebook.drawee.generic.GenericDraweeHierarchy@c03d1b0
12-22 15:52:58.856   491   491 V unknown:AbstractDraweeController: controller ef0f7ae null -> 2: initialize
12-22 15:52:58.856   491   491 V unknown:AbstractDraweeController: controller ef0f7ae 2: setHierarchy: com.facebook.drawee.generic.GenericDraweeHierarchy@6a4a94f
12-22 15:52:58.862   491   491 V unknown:AbstractDraweeController: controller 1cc58dc null -> 3: initialize
12-22 15:52:58.863   491   491 V unknown:AbstractDraweeController: controller 1cc58dc 3: setHierarchy: com.facebook.drawee.generic.GenericDraweeHierarchy@d3d0de5
12-22 15:52:58.869   491   491 V unknown:AbstractDraweeController: controller 158e0ba null -> 4: initialize
12-22 15:52:58.869   491   491 V unknown:AbstractDraweeController: controller 158e0ba 4: setHierarchy: com.facebook.drawee.generic.GenericDraweeHierarchy@12c8b6b
12-22 15:52:58.872   491   491 V unknown:AbstractDraweeController: controller 3a5f0f3 1: onAttach: request needs submit
12-22 15:52:58.878   491   491 V unknown:AbstractDraweeController: controller 3a5f0f3 1: submitRequest: dataSource: ab5a361
12-22 15:52:58.878   491   491 V unknown:AbstractDraweeController: controller 1cc58dc 3: onAttach: request needs submit
12-22 15:52:58.879   491   491 V unknown:AbstractDraweeController: controller 1cc58dc 3: submitRequest: dataSource: 5244e86
12-22 15:52:58.879   491   491 V unknown:AbstractDraweeController: controller 77d4657 0: onAttach: request needs submit
12-22 15:52:58.880   491   491 V unknown:AbstractDraweeController: controller 77d4657 0: submitRequest: dataSource: 2067347
12-22 15:52:58.880   491   491 V unknown:AbstractDraweeController: controller ef0f7ae 2: onAttach: request needs submit
12-22 15:52:58.881   491   491 V unknown:AbstractDraweeController: controller ef0f7ae 2: submitRequest: dataSource: 3c8e774
12-22 15:52:58.881   491   491 V unknown:AbstractDraweeController: controller 158e0ba 4: onAttach: request needs submit
12-22 15:52:58.882   491   491 V unknown:AbstractDraweeController: controller 158e0ba 4: submitRequest: dataSource: ac8149d
12-22 15:52:58.898   491   535 V unknown:BufferedDiskCache: Did not find image for https://placekitten.com/g/201/300 in staging area
12-22 15:52:58.899   491   535 V unknown:BufferedDiskCache: Disk cache read for https://placekitten.com/g/201/300
12-22 15:52:58.904   491   535 V unknown:BufferedDiskCache: Disk cache miss for https://placekitten.com/g/201/300

清单

    <application
    android:name=".utils.MyApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:logo="@drawable/home"
    android:screenOrientation="portrait"
    android:theme="@style/AppTheme" >

我不知道其中的逻辑,但 Fresco 更喜欢从文件中获取 Uri。首先将您的 uri 转换为文件,然后从该文件中获取 Uri。它适用于本地存储。

public static void loadImg(final Context c, final SimpleDraweeView view, final String img){
    Uri uri = Uri.parse("https://placekitten.com/g/201/300");
    view.setImageURI(Uri.fromFile(new File(uri)));
}

在 GitHub HERE 的壁画存储库中报告了类似的问题(在报告的主要问题下方的评论中)

根据报告该问题的开发者的评论:

It seems to be a random thing : it's ok for most images. When cache is cleared for testing, the few images that are "not loaded" aren't the same between runs. I've "200" response from apache for image that are correctly loaded and display (apache log). And no log at all for random crashing images.

我建议尝试其他开发人员针对此问题提出的以下建议:

  1. (From the issue report page)清除缓存并重试。
  2. (From the issue report page) 使用 HTTP proxy/monitor 找出您从服务器得到的响应。如果您收到 204 No Content 服务器可能不接受 user-agent header.
  3. (My suggestion) 尝试使用完全不同的 url 加载图像,看看是每张图像都会发生这种情况,还是只有这一张。如果只是这一点,可能是图片的问题。

同一问题的另一份报告HERE - 但是这个报告还没有任何具体的解决方案回复。

您可能还想订阅关于这些 post 的通知,以防很快有人 post 提出了一个非常好的解决方案并且它被合并了。然后你就可以获得最新版本并冷静下来。 :)(如果以上任何一项都不适合您。)

你需要一个直接的link,例如:http://i.imgur.com/IJF8x9D.jpg

并且您应该在 uri 末尾添加文件类型。对于这种情况:“.jpg”

Uri uri = Uri.parse("http://i.imgur.com/IJF8x9D.jpg");

试试这个

SimpleDraweeView imageView= (SimpleDraweeView) v.findViewById(R.id.full_ad_unit);

Uri imageUri = Uri.parse(imagePath);

ImageRequest request = ImageRequest.fromUri(imageUri);

DraweeController controller = Fresco.newDraweeControllerBuilder()
    .setImageRequest(request)
    .setOldController(imageView.getController()).build();

Log.e(TAG, "ImagePath uri " + imageUri);

imageView.setController(controller);

如果您在加载大图像时遇到问题,只需在配置图像管道时启用下采样。

像这样写你的 Fresco 初始化

ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this)
            .setDownsampleEnabled(true)
             ...
            .build();
Fresco.initialize(this, config);

我知道这是一个老问题,但对于那些进入这里的人来说: Fresco 不支持 android:layout_width="wrap_content"android:layout_height="wrap_content"。这个问题已经完全回答了