Glide 在加载动画 jpg 时使应用程序崩溃

Glide crashes app on loading an animated jpg

所以,我正在使用 Glide 和下面的代码从 imgur 加载照片。

try {
    ViewTarget viewTarget = new ViewTarget<SubsamplingScaleImageView, BitmapDrawable>(image_view) {
        @Override
        public void onResourceReady(BitmapDrawable bitmap, Transition<? super BitmapDrawable> transition) {
            this.view.setImage(ImageSource.bitmap(bitmap.getBitmap()));
        }
    };

    GlideApp.with(this).load(post_to_show.getUrl()).into(viewTarget);
} catch (ClassCastException e){}

其中 SubsamplingScaleImageView 是一个自定义 ImageView 扩展视图。 不过这里没关系。

它工作正常,直到我尝试加载类似 this

的东西

它有一个 .jpg 扩展名,但它是一个 gif。

我收到这个错误:

E/AndroidRuntime: FATAL EXCEPTION: main Process: me.ekhaled667.ridit, PID: 6202 java.lang.ClassCastException: com.bumptech.glide.load.resource.gif.GifDrawable cannot be cast to android.graphics.drawable.BitmapDrawable at me.ekhaled667.ridit.PostFragment.onResourceReady(PostFragment.java:257) at com.bumptech.glide.request.SingleRequest.onResourceReady(SingleRequest.java:579) at com.bumptech.glide.request.SingleRequest.onResourceReady(SingleRequest.java:549) at com.bumptech.glide.load.engine.EngineJob.handleResultOnMainThread(EngineJob.java:218) at com.bumptech.glide.load.engine.EngineJob$MainThreadCallback.handleMessage(EngineJob.java:324) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:163) at android.app.ActivityThread.main(ActivityThread.java:6348) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:880) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:770)

第一:为什么不作为异常捕获?

第二:我怎么可能解决这个问题,或者换句话说,知道这是 gif 而不是 jpg 并正确加载它?

您可以使用此代码显示 gif。

load=(ImageView) findViewById(R.id.loadimg);

GlideDrawableImageViewTarget imageViewTarget = new GlideDrawableImageViewTarget(load);
Glide.with(this).load(post_to_show.getUrl()).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageViewTarget);

请检查下面的代码,它可能会有所帮助:

Dependency

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.imageView)SubsamplingScaleImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ButterKnife.bind(this);

        gifImage();
    }

    public void gifImage(){

        ViewTarget viewTarget = new ViewTarget<SubsamplingScaleImageView,GifDrawable>(imageView) {
            @Override
            public void onResourceReady(@NonNull GifDrawable resource, @Nullable Transition<? super GifDrawable> transition) {
                this.view.setImage(ImageSource.bitmap(resource.getFirstFrame()));
            }
        };

        Glide.with(this)
                .asGif()
                .load("https://metrouk2.files.wordpress.com/2018/03/giphy9.gif?w=748&h=561&crop=1")
                .listener(new RequestListener<GifDrawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) {
                        Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
                        return false;
                    }
                })
                .into(viewTarget);

    }


}

XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</android.support.constraint.ConstraintLayout>

图片文件:

public class GlideActivity extends AppCompatActivity {

    @BindView(R.id.imageView)ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_glide);

        ButterKnife.bind(this);

        gifImage();
    }

    public void gifImage() {

        Glide.with(this).load("http://imagesourceteam.com/wp-content/uploads/2017/01/rr.jpg").into(imageView);

    }
}

activity_glide.xml 文件.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">

   <ImageView
       android:id="@+id/imageView"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content" />

</android.support.constraint.ConstraintLayout>

因此,感谢@Kaushal Gosaliya,我想出了一种方法来实现这一点,但 GIF 将仅显示为静态图像。

ViewTarget viewTarget = new ViewTarget<SubsamplingScaleImageView, Drawable>(image_view) {
            @Override
            public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                Bitmap mutableBitmap = Bitmap.createBitmap(resource.getIntrinsicWidth(), resource.getIntrinsicHeight(), Bitmap.Config.RGB_565);
                Canvas canvas = new Canvas(mutableBitmap);
                resource.setBounds(0, 0, resource.getIntrinsicWidth(), resource.getIntrinsicHeight());
                resource.draw(canvas);

                this.view.setImage(ImageSource.bitmap(mutableBitmap));
            }
        };

这是您要使用的 ViewTarget,您可以在其中将 BitmapDrawable 更改为 Drawable 以包含所有可绘制对象。 然后将可绘制对象转换为位图。