提交 9aee1250 编写于 作者: S Sam Judd

Cleanup data in LocalUriFetcher

上级 dbb67f82
package com.bumptech.glide.load.resource;
import android.content.ContentResolver;
import android.content.Context;
import android.net.Uri;
import com.bumptech.glide.Priority;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import java.io.Closeable;
import java.io.FileNotFoundException;
import java.io.IOException;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@RunWith(RobolectricTestRunner.class)
public class LocalUriFetcherTest {
private TestLocalUriFetcher fetcher;
@Before
public void setUp() {
fetcher = new TestLocalUriFetcher(Robolectric.application, Uri.parse("content://empty"));
}
@Test
public void testClosesDataOnCleanup() throws Exception {
Closeable closeable = fetcher.loadResource(Priority.NORMAL);
fetcher.cleanup();
verify(closeable).close();
}
@Test
public void testDoesNotCLoseNullData() throws IOException {
fetcher.cleanup();
verify(fetcher.closeable, never()).close();
}
@Test
public void testHandlesExceptionOnClose() throws Exception {
Closeable closeable = fetcher.loadResource(Priority.NORMAL);
doThrow(new IOException("Test")).when(closeable).close();
fetcher.cleanup();
verify(closeable).close();
}
private static class TestLocalUriFetcher extends LocalUriFetcher<Closeable> {
public Closeable closeable = mock(Closeable.class);
public TestLocalUriFetcher(Context context, Uri uri) {
super(context, uri);
}
@Override
protected Closeable loadResource(Uri uri, ContentResolver contentResolver) throws FileNotFoundException {
return closeable;
}
}
}
...@@ -3,17 +3,22 @@ package com.bumptech.glide.load.resource; ...@@ -3,17 +3,22 @@ package com.bumptech.glide.load.resource;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import android.util.Log;
import com.bumptech.glide.Priority; import com.bumptech.glide.Priority;
import java.io.Closeable;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
/** /**
* *
*/ */
public abstract class LocalUriFetcher<T> implements ResourceFetcher<T> { public abstract class LocalUriFetcher<T extends Closeable> implements ResourceFetcher<T> {
private static final String TAG = "LocalUriFetcher";
private final WeakReference<Context> contextRef; private final WeakReference<Context> contextRef;
private final Uri uri; private final Uri uri;
private T data;
/** /**
* Opens an input stream for a uri pointing to a local asset. Only certain uris are supported * Opens an input stream for a uri pointing to a local asset. Only certain uris are supported
...@@ -37,14 +42,23 @@ public abstract class LocalUriFetcher<T> implements ResourceFetcher<T> { ...@@ -37,14 +42,23 @@ public abstract class LocalUriFetcher<T> implements ResourceFetcher<T> {
throw new NullPointerException("Context has been cleared in LocalUriFetcher uri: " + uri); throw new NullPointerException("Context has been cleared in LocalUriFetcher uri: " + uri);
} }
ContentResolver contentResolver = context.getContentResolver(); ContentResolver contentResolver = context.getContentResolver();
return loadResource(uri, contentResolver); data = loadResource(uri, contentResolver);
return data;
} }
@Override @Override
public void cleanup() { public void cleanup() {
// Do nothing. if (data != null) {
} try {
data.close();
} catch (IOException e) {
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "failed to close data", e);
}
}
}
}
@Override @Override
public void cancel() { public void cancel() {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册