image-coil fix image loading
This commit is contained in:
parent
961ff32c9a
commit
be667e3b45
@ -1,5 +1,12 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
# SNAPSHOT
|
||||||
|
|
||||||
|
#### Fixed
|
||||||
|
* `image-coil` - deliver image result if it loaded before request disposable is created ([#272])
|
||||||
|
|
||||||
|
[#272]: https://github.com/noties/Markwon/issues/272
|
||||||
|
|
||||||
# 4.5.0
|
# 4.5.0
|
||||||
|
|
||||||
#### Added
|
#### Added
|
||||||
|
@ -2,7 +2,6 @@ package io.noties.markwon.app.samples.image
|
|||||||
|
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import coil.Coil
|
import coil.Coil
|
||||||
import coil.ImageLoader
|
|
||||||
import coil.request.LoadRequest
|
import coil.request.LoadRequest
|
||||||
import coil.request.RequestDisposable
|
import coil.request.RequestDisposable
|
||||||
import coil.transform.RoundedCornersTransformation
|
import coil.transform.RoundedCornersTransformation
|
||||||
@ -15,7 +14,6 @@ import io.noties.markwon.image.coil.CoilImagesPlugin
|
|||||||
import io.noties.markwon.recycler.MarkwonAdapter
|
import io.noties.markwon.recycler.MarkwonAdapter
|
||||||
import io.noties.markwon.sample.annotations.MarkwonArtifact
|
import io.noties.markwon.sample.annotations.MarkwonArtifact
|
||||||
import io.noties.markwon.sample.annotations.MarkwonSampleInfo
|
import io.noties.markwon.sample.annotations.MarkwonSampleInfo
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
|
|
||||||
@MarkwonSampleInfo(
|
@MarkwonSampleInfo(
|
||||||
id = "20200803132053",
|
id = "20200803132053",
|
||||||
|
@ -12,6 +12,7 @@ import org.commonmark.node.Image;
|
|||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
import coil.Coil;
|
import coil.Coil;
|
||||||
import coil.ImageLoader;
|
import coil.ImageLoader;
|
||||||
@ -124,12 +125,21 @@ public class CoilImagesPlugin extends AbstractMarkwonPlugin {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(@NonNull AsyncDrawable drawable) {
|
public void load(@NonNull AsyncDrawable drawable) {
|
||||||
final Target target = new AsyncDrawableTarget(drawable);
|
final AtomicBoolean loaded = new AtomicBoolean(false);
|
||||||
LoadRequest request = coilStore.load(drawable).newBuilder()
|
final Target target = new AsyncDrawableTarget(drawable, loaded);
|
||||||
|
final LoadRequest request = coilStore.load(drawable).newBuilder()
|
||||||
.target(target)
|
.target(target)
|
||||||
.build();
|
.build();
|
||||||
RequestDisposable disposable = imageLoader.execute(request);
|
// @since $SNAPSHOT; execute can return result _before_ disposable is created,
|
||||||
cache.put(drawable, disposable);
|
// thus `execute` would finish before we put disposable in cache (and thus result is
|
||||||
|
// not delivered)
|
||||||
|
final RequestDisposable disposable = imageLoader.execute(request);
|
||||||
|
// if flag was not set, then job is running (else - finished before we got here)
|
||||||
|
if (!loaded.get()) {
|
||||||
|
// mark flag
|
||||||
|
loaded.set(true);
|
||||||
|
cache.put(drawable, disposable);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -149,14 +159,20 @@ public class CoilImagesPlugin extends AbstractMarkwonPlugin {
|
|||||||
private class AsyncDrawableTarget implements Target {
|
private class AsyncDrawableTarget implements Target {
|
||||||
|
|
||||||
private final AsyncDrawable drawable;
|
private final AsyncDrawable drawable;
|
||||||
|
private final AtomicBoolean loaded;
|
||||||
|
|
||||||
AsyncDrawableTarget(@NonNull AsyncDrawable drawable) {
|
private AsyncDrawableTarget(@NonNull AsyncDrawable drawable, @NonNull AtomicBoolean loaded) {
|
||||||
this.drawable = drawable;
|
this.drawable = drawable;
|
||||||
|
this.loaded = loaded;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(@NonNull Drawable loadedDrawable) {
|
public void onSuccess(@NonNull Drawable loadedDrawable) {
|
||||||
if (cache.remove(drawable) != null) {
|
// @since $SNAPSHOT; check finished flag (result can be delivered _before_ disposable is created)
|
||||||
|
if (cache.remove(drawable) != null
|
||||||
|
|| !loaded.get()) {
|
||||||
|
// mark
|
||||||
|
loaded.set(true);
|
||||||
if (drawable.isAttached()) {
|
if (drawable.isAttached()) {
|
||||||
DrawableUtils.applyIntrinsicBoundsIfEmpty(loadedDrawable);
|
DrawableUtils.applyIntrinsicBoundsIfEmpty(loadedDrawable);
|
||||||
drawable.setResult(loadedDrawable);
|
drawable.setResult(loadedDrawable);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user