From a2bac48af7640a2cdd90e2c6f40c594c93854eb1 Mon Sep 17 00:00:00 2001 From: Jorge Ruesga Date: Wed, 23 Oct 2013 00:58:33 +0200 Subject: Force to run discover AsyncTask out of the GLThread AsyncTask can't create a valid handler in ICS (works in JB+), so we force it to run in a UI thread. Signed-off-by: Jorge Ruesga --- .../wallpapers/photophase/PhotoPhaseRenderer.java | 2 +- .../android/wallpapers/photophase/TextureManager.java | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/com/ruesga/android/wallpapers/photophase/PhotoPhaseRenderer.java b/src/com/ruesga/android/wallpapers/photophase/PhotoPhaseRenderer.java index b68b3b6..b6e09dd 100644 --- a/src/com/ruesga/android/wallpapers/photophase/PhotoPhaseRenderer.java +++ b/src/com/ruesga/android/wallpapers/photophase/PhotoPhaseRenderer.java @@ -495,7 +495,7 @@ public class PhotoPhaseRenderer implements GLSurfaceView.Renderer { // Recycle the current texture manager and create a new one recycle(); mTextureManager = new TextureManager( - mContext, mEffectContext, mDispatcher, cc, dimensions); + mContext, mHandler, mEffectContext, mDispatcher, cc, dimensions); } } diff --git a/src/com/ruesga/android/wallpapers/photophase/TextureManager.java b/src/com/ruesga/android/wallpapers/photophase/TextureManager.java index 033ca6c..a21051a 100644 --- a/src/com/ruesga/android/wallpapers/photophase/TextureManager.java +++ b/src/com/ruesga/android/wallpapers/photophase/TextureManager.java @@ -24,6 +24,7 @@ import android.media.ThumbnailUtils; import android.media.effect.Effect; import android.media.effect.EffectContext; import android.opengl.GLES20; +import android.os.Handler; import android.util.Log; import android.widget.Toast; @@ -50,12 +51,13 @@ public class TextureManager implements OnMediaPictureDiscoveredListener { private static final int QUEUE_SIZE = 3; final Context mContext; + final Handler mHandler; final Effects mEffects; final Object mSync; final List mPendingRequests; final FixedQueue mQueue = new FixedQueue(QUEUE_SIZE); BackgroundPictureLoaderThread mBackgroundTask; - private final MediaPictureDiscoverer mPictureDiscoverer; + /*protected*/ final MediaPictureDiscoverer mPictureDiscoverer; /*package*/ Rect mScreenDimensions; /*package*/ Rect mDimensions; @@ -138,10 +140,11 @@ public class TextureManager implements OnMediaPictureDiscoveredListener { * @param requestors The number of requestors * @param screenDimensions The screen dimensions */ - public TextureManager(final Context ctx, final EffectContext effectCtx, + public TextureManager(final Context ctx, final Handler handler, final EffectContext effectCtx, GLESSurfaceDispatcher dispatcher, int requestors, Rect screenDimensions) { super(); mContext = ctx; + mHandler = handler; mEffects = new Effects(effectCtx); mDispatcher = dispatcher; mScreenDimensions = screenDimensions; @@ -202,10 +205,18 @@ public class TextureManager implements OnMediaPictureDiscoveredListener { * * @param userRequest If the request was generated by the user */ - void reloadMedia(boolean userRequest) { + void reloadMedia(final boolean userRequest) { Log.d(TAG, "Reload media picture data"); // Discovery new media - mPictureDiscoverer.discover(userRequest); + // GLThread doesn't run in the UI thread and AsyncThread can't create a + // valid handler in ICS (it's fixed in JB+) so we force to run the async + // thread in a valid UI thread + mHandler.post(new Runnable() { + @Override + public void run() { + mPictureDiscoverer.discover(userRequest); + } + }); } /** -- cgit v1.2.3