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);
请检查下面的代码,它可能会有所帮助:
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 以包含所有可绘制对象。
然后将可绘制对象转换为位图。
所以,我正在使用 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);
请检查下面的代码,它可能会有所帮助:
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 以包含所有可绘制对象。 然后将可绘制对象转换为位图。