From 044017c29c4120c1778acadf2ed872ee0c6f9bc1 Mon Sep 17 00:00:00 2001 From: Yoann Delouis Date: Mon, 4 Mar 2013 09:57:56 +0100 Subject: [PATCH 1/4] Add delay in @Background --- .../annotations/Background.java | 1 + .../helper/APTCodeModelHelper.java | 13 ++++++++++ .../processing/BackgroundProcessor.java | 24 +++++++++++++++---- .../test15/ThreadActivity.java | 6 ++++- 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/Background.java b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/Background.java index 8724637341..323b489223 100644 --- a/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/Background.java +++ b/AndroidAnnotations/androidannotations-api/src/main/java/org/androidannotations/annotations/Background.java @@ -28,4 +28,5 @@ @Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) public @interface Background { + long delay() default 0; } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java index 1648c76447..c2b1b8d0e5 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java @@ -228,6 +228,19 @@ public String getIdStringFromIdFieldRef(JFieldRef idRef) { throw new IllegalStateException("Unable to extract target name from JFieldRef"); } + public JDefinedClass createAnonymousRunnableClass(EBeanHolder holder, JStatement block) { + JCodeModel codeModel = holder.codeModel(); + JDefinedClass anonymousRunnableClass = codeModel.anonymousClass(Runnable.class); + + JMethod runMethod = anonymousRunnableClass.method(JMod.PUBLIC, codeModel.VOID, "run"); + runMethod.annotate(Override.class); + + JBlock runMethodBody = runMethod.body(); + runMethodBody.add(block); + + return anonymousRunnableClass; + } + public JDefinedClass createDelegatingAnonymousRunnableClass(EBeanHolder holder, JMethod delegatedMethod) { JCodeModel codeModel = holder.codeModel(); diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java index dc70e3c8ed..3ff3a0fe07 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java @@ -15,6 +15,10 @@ */ package org.androidannotations.processing; +import static com.sun.codemodel.JExpr._new; +import static com.sun.codemodel.JExpr.lit; + +import java.lang.annotation.Annotation; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; @@ -29,6 +33,7 @@ import com.sun.codemodel.JExpr; import com.sun.codemodel.JInvocation; import com.sun.codemodel.JMethod; +import com.sun.codemodel.JMod; public class BackgroundProcessor implements DecoratingElementProcessor { @@ -52,13 +57,24 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) t { // Execute Runnable - JClass backgroundExecutorClass = holder.refClass(BackgroundExecutor.class); + Background annotation = element.getAnnotation(Background.class); + long delay = annotation.delay(); - JInvocation executeCall = backgroundExecutorClass.staticInvoke("execute").arg(JExpr._new(anonymousRunnableClass)); + JClass backgroundExecutorClass = holder.refClass(BackgroundExecutor.class); + JInvocation executeCall = backgroundExecutorClass.staticInvoke("execute").arg(_new(anonymousRunnableClass)); + + if (delay == 0) { + delegatingMethod.body().add(executeCall); + } else { + JDefinedClass anonymousExecutorRunnableClass = helper.createAnonymousRunnableClass(holder, executeCall); + if (holder.handler == null) { + JClass handlerClass = holder.classes().HANDLER; + holder.handler = holder.generatedClass.field(JMod.PRIVATE, handlerClass, "handler_", _new(handlerClass)); + } + delegatingMethod.body().invoke(holder.handler, "postDelayed").arg(_new(anonymousExecutorRunnableClass)).arg(lit(delay)); + } - delegatingMethod.body().add(executeCall); } } - } diff --git a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ThreadActivity.java b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ThreadActivity.java index a82376a2b1..83410dd0de 100644 --- a/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ThreadActivity.java +++ b/AndroidAnnotations/functional-test-1-5/src/main/java/org/androidannotations/test15/ThreadActivity.java @@ -18,7 +18,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import java.util.SortedSet; import org.androidannotations.annotations.Background; import org.androidannotations.annotations.EActivity; @@ -40,6 +39,11 @@ void emptyUiMethod() { @Background void emptyBackgroundMethod() { + } + + @Background(delay = 1000) + void emptyDelayedBackgroundMethod() { + } @UiThread From 31adbd84d836a8a0c74da08c0565781a2465c690 Mon Sep 17 00:00:00 2001 From: Yoann Delouis Date: Wed, 6 Mar 2013 15:00:48 +0100 Subject: [PATCH 2/4] Use ScheduledExecutorService instead of Handler --- .../api/BackgroundExecutor.java | 12 +++++++++++- .../processing/BackgroundProcessor.java | 16 +++++----------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/BackgroundExecutor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/BackgroundExecutor.java index c8c56c814b..9c37d4e055 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/BackgroundExecutor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/BackgroundExecutor.java @@ -17,17 +17,27 @@ import java.util.concurrent.Executor; import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; public class BackgroundExecutor { private static Executor executor = Executors.newCachedThreadPool(); + private static ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1); public static void execute(Runnable runnable) { executor.execute(runnable); } - + public static void setExecutor(Executor executor) { BackgroundExecutor.executor = executor; } + public static void executeDelayed(Runnable runnable, long delay) { + scheduledExecutor.schedule(runnable, delay, TimeUnit.MILLISECONDS); + } + + public static void setScheduledExecutor(ScheduledExecutorService scheduledExecutor) { + BackgroundExecutor.scheduledExecutor = scheduledExecutor; + } } diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java index 3ff3a0fe07..9db4750e47 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/processing/BackgroundProcessor.java @@ -18,7 +18,6 @@ import static com.sun.codemodel.JExpr._new; import static com.sun.codemodel.JExpr.lit; -import java.lang.annotation.Annotation; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; @@ -30,10 +29,8 @@ import com.sun.codemodel.JClassAlreadyExistsException; import com.sun.codemodel.JCodeModel; import com.sun.codemodel.JDefinedClass; -import com.sun.codemodel.JExpr; import com.sun.codemodel.JInvocation; import com.sun.codemodel.JMethod; -import com.sun.codemodel.JMod; public class BackgroundProcessor implements DecoratingElementProcessor { @@ -61,19 +58,16 @@ public void process(Element element, JCodeModel codeModel, EBeanHolder holder) t long delay = annotation.delay(); JClass backgroundExecutorClass = holder.refClass(BackgroundExecutor.class); - JInvocation executeCall = backgroundExecutorClass.staticInvoke("execute").arg(_new(anonymousRunnableClass)); + JInvocation executeCall; if (delay == 0) { - delegatingMethod.body().add(executeCall); + executeCall = backgroundExecutorClass.staticInvoke("execute").arg(_new(anonymousRunnableClass)); } else { - JDefinedClass anonymousExecutorRunnableClass = helper.createAnonymousRunnableClass(holder, executeCall); - if (holder.handler == null) { - JClass handlerClass = holder.classes().HANDLER; - holder.handler = holder.generatedClass.field(JMod.PRIVATE, handlerClass, "handler_", _new(handlerClass)); - } - delegatingMethod.body().invoke(holder.handler, "postDelayed").arg(_new(anonymousExecutorRunnableClass)).arg(lit(delay)); + executeCall = backgroundExecutorClass.staticInvoke("executeDelayed").arg(_new(anonymousRunnableClass)).arg(lit(delay)); } + delegatingMethod.body().add(executeCall); + } } From 8fc6e05d69215910a39e86ff267de793a8e62ce9 Mon Sep 17 00:00:00 2001 From: Yoann Delouis Date: Mon, 11 Mar 2013 09:22:09 +0100 Subject: [PATCH 3/4] Remove unused method --- .../helper/APTCodeModelHelper.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java index c2b1b8d0e5..1648c76447 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/helper/APTCodeModelHelper.java @@ -228,19 +228,6 @@ public String getIdStringFromIdFieldRef(JFieldRef idRef) { throw new IllegalStateException("Unable to extract target name from JFieldRef"); } - public JDefinedClass createAnonymousRunnableClass(EBeanHolder holder, JStatement block) { - JCodeModel codeModel = holder.codeModel(); - JDefinedClass anonymousRunnableClass = codeModel.anonymousClass(Runnable.class); - - JMethod runMethod = anonymousRunnableClass.method(JMod.PUBLIC, codeModel.VOID, "run"); - runMethod.annotate(Override.class); - - JBlock runMethodBody = runMethod.body(); - runMethodBody.add(block); - - return anonymousRunnableClass; - } - public JDefinedClass createDelegatingAnonymousRunnableClass(EBeanHolder holder, JMethod delegatedMethod) { JCodeModel codeModel = holder.codeModel(); From 98c361ad1cf3f38fd7257ab258573dcfcaeb5366 Mon Sep 17 00:00:00 2001 From: Yoann Delouis Date: Wed, 13 Mar 2013 09:22:04 +0100 Subject: [PATCH 4/4] Change corePoolSize from 1 to 2 * Runtime.availableProcessors() --- .../java/org/androidannotations/api/BackgroundExecutor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/BackgroundExecutor.java b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/BackgroundExecutor.java index 9c37d4e055..35b90a96aa 100644 --- a/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/BackgroundExecutor.java +++ b/AndroidAnnotations/androidannotations/src/main/java/org/androidannotations/api/BackgroundExecutor.java @@ -23,7 +23,7 @@ public class BackgroundExecutor { private static Executor executor = Executors.newCachedThreadPool(); - private static ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1); + private static ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(2 * Runtime.getRuntime().availableProcessors()); public static void execute(Runnable runnable) { executor.execute(runnable);