diff options
author | Koushik Dutta <koushd@gmail.com> | 2014-11-07 18:49:27 -0800 |
---|---|---|
committer | Koushik Dutta <koushd@gmail.com> | 2014-11-07 18:49:27 -0800 |
commit | 255ff987a813acd8002710fa8fee95511d59224c (patch) | |
tree | e5f0078fd81655fda5dd0f40afe4ea17c43a8b24 /AndroidAsync | |
parent | 02b146297b392fce04642ca9ab3d653cf19c7424 (diff) | |
download | AndroidAsync-255ff987a813acd8002710fa8fee95511d59224c.tar.gz AndroidAsync-255ff987a813acd8002710fa8fee95511d59224c.tar.bz2 AndroidAsync-255ff987a813acd8002710fa8fee95511d59224c.zip |
Fix crash bug when cancelling requests being cached.
https://github.com/koush/ion/issues/252#issuecomment-62217371
Diffstat (limited to 'AndroidAsync')
3 files changed, 57 insertions, 26 deletions
diff --git a/AndroidAsync/src/com/koushikdutta/async/FilteredDataEmitter.java b/AndroidAsync/src/com/koushikdutta/async/FilteredDataEmitter.java index 576b5d6..9309180 100644 --- a/AndroidAsync/src/com/koushikdutta/async/FilteredDataEmitter.java +++ b/AndroidAsync/src/com/koushikdutta/async/FilteredDataEmitter.java @@ -45,6 +45,12 @@ public class FilteredDataEmitter extends DataEmitterBase implements DataEmitter, private int totalRead; @Override public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) { + if (closed) { + // this emitter was closed but for some reason data is still being spewed... + // eat it, nom nom. + bb.recycle(); + return; + } if (bb != null) totalRead += bb.remaining(); Util.emitAllData(this, bb); @@ -81,9 +87,12 @@ public class FilteredDataEmitter extends DataEmitterBase implements DataEmitter, return mEmitter.getServer(); } + boolean closed; @Override public void close() { - mEmitter.close(); + closed = true; + if (mEmitter != null) + mEmitter.close(); } @Override diff --git a/AndroidAsync/src/com/koushikdutta/async/http/cache/ResponseCacheMiddleware.java b/AndroidAsync/src/com/koushikdutta/async/http/cache/ResponseCacheMiddleware.java index bf0e92c..36e0889 100644 --- a/AndroidAsync/src/com/koushikdutta/async/http/cache/ResponseCacheMiddleware.java +++ b/AndroidAsync/src/com/koushikdutta/async/http/cache/ResponseCacheMiddleware.java @@ -340,7 +340,7 @@ public class ResponseCacheMiddleware extends SimpleMiddleware { @Override public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) { if (cached != null) { - com.koushikdutta.async.Util.emitAllData(this, cached); + super.onDataAvailable(emitter, cached); // couldn't emit it all, so just wait for another day... if (cached.remaining() > 0) return; @@ -384,6 +384,12 @@ public class ResponseCacheMiddleware extends SimpleMiddleware { } } + @Override + public void close() { + abort(); + super.close(); + } + public void abort() { if (editor != null) { editor.abort(); diff --git a/AndroidAsync/test/src/com/koushikdutta/async/test/CacheTests.java b/AndroidAsync/test/src/com/koushikdutta/async/test/CacheTests.java index 2edd1ae..990d7dd 100644 --- a/AndroidAsync/test/src/com/koushikdutta/async/test/CacheTests.java +++ b/AndroidAsync/test/src/com/koushikdutta/async/test/CacheTests.java @@ -4,6 +4,11 @@ import android.test.AndroidTestCase; import com.koushikdutta.async.AsyncServer; import com.koushikdutta.async.AsyncServerSocket; +import com.koushikdutta.async.ByteBufferList; +import com.koushikdutta.async.DataEmitter; +import com.koushikdutta.async.FilteredDataEmitter; +import com.koushikdutta.async.Util; +import com.koushikdutta.async.callback.DataCallback; import com.koushikdutta.async.http.AsyncHttpClient; import com.koushikdutta.async.http.AsyncHttpGet; import com.koushikdutta.async.http.HttpDate; @@ -14,7 +19,10 @@ import com.koushikdutta.async.http.server.AsyncHttpServerResponse; import com.koushikdutta.async.http.server.HttpServerRequestCallback; import java.io.File; +import java.nio.ByteBuffer; import java.util.Date; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; /** * Created by koush on 6/13/13. @@ -53,29 +61,37 @@ public class CacheTests extends AndroidTestCase { } } -// static public boolean deleteDirectory(File path) { -// if (path.exists()) { -// File[] files = path.listFiles(); -// if (files != null) { -// for (int i = 0; i < files.length; i++) { -// if (files[i].isDirectory()) { -// deleteDirectory(files[i]); -// } else { -// files[i].delete(); -// } -// } -// } -// } -// return (path.delete()); -// } + private static final long TIMEOUT = 1000L; + public void testFilteredDataEmitter() throws Exception { + final Semaphore semaphore = new Semaphore(0); -// public void testDiskLruCache() throws Exception { -// File dir = new File(Environment.getExternalStorageDirectory(), "AndroidAsyncTest/cache-test"); -// deleteDirectory(dir); -// DiskLruCache cache = DiskLruCache.open(dir, 0, 1000, 10000000); -// DiskLruCache.Editor editor = cache.edit("stuff"); -// -// DiskLruCache cache2 = DiskLruCache.open(dir, 0, 2, 10000000); -// DiskLruCache.Snapshot snapshot = cache2.get("stuff"); -// } + FilteredDataEmitter f = new FilteredDataEmitter() { + @Override + public boolean isPaused() { + return false; + } + }; + + f.setDataCallback(new DataCallback() { + @Override + public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) { + assertEquals(bb.readString(), "hello"); + bb.recycle(); + semaphore.release(); + } + }); + + f.onDataAvailable(f, new ByteBufferList().add(ByteBuffer.wrap("hello".getBytes()))); + assertTrue("timeout", semaphore.tryAcquire(TIMEOUT, TimeUnit.MILLISECONDS)); + + f.setDataCallback(new DataCallback() { + @Override + public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) { + fail(); + } + }); + f.close(); + + f.onDataAvailable(f, new ByteBufferList().add(ByteBuffer.wrap("hello".getBytes()))); + } } |