Glide вылетает приложение при загрузке анимированного JPG - PullRequest
0 голосов
/ 03 мая 2018

Итак, я загружаю фотографии из imgur, используя Glide с кодом ниже.

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 - это, ну, в общем, расширение представления Custom ImageView. Но это не имеет значения.

Работает нормально, пока не попробую загрузить что-то вроде this

Имеет расширение .jpg, но это GIF.

Я получаю эту ошибку:

E / AndroidRuntime: FATAL EXCEPTION: main Процесс: me.ekhaled667.ridit, PID: 6202 java.lang.ClassCastException: com.bumptech.glide.load.resource.gif.GifDrawable не может быть приведен к android.graphics.drawable.BitmapDrawable на me.ekhaled667.ridit.PostFragment $ 1.onResourceReady (PostFragment.java:257) на com.bumptech.glide.request.SingleRequest.onResourceReady (SingleRequest.java:579) на com.bumptech.glide.request.SingleRequest.onResourceReady (SingleRequest.java:549) на com.bumptech.glide.load.engine.EngineJob.handleResultOnMainThread (EngineJob.java:218) на com.bumptech.glide.load.engine.EngineJob $ MainThreadCallback.handleMessage (EngineJob.java:324) на android.os.Handler.dispatchMessage (Handler.java:98) на android.os.Looper.loop (Looper.java:163) на android.app.ActivityThread.main (ActivityThread.java:6348) в java.lang.reflect.Method.invoke (родной метод) на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:880) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:770)

Во-первых: почему он не был пойман как исключение?

Во-вторых: как я могу обойти это, или другими словами, знать, что это gif, а не jpg, и загрузить его правильно?

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Пожалуйста, проверьте ниже код, это может быть полезно:

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>
0 голосов
/ 06 мая 2018

Так что я решил, как это работает, благодаря @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, чтобы охватить все рисованные объекты. Затем вы преобразуете рисунок в растровое изображение.

0 голосов
/ 04 мая 2018

Вы можете показать 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);
...