/** * Copyright (C) 2010-2016 eBusiness Information, Excilys Group * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed To in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.androidannotations.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * <p> * Should be used on method that must be run in a background thread. * </p> * <p> * The annotated method MUST return void and MAY contain parameters. * </p> * <p> * The generated code is based on * {@link org.androidannotations.api.BackgroundExecutor BackgroundExecutor} * methods. * </p> * * <h2>Cancellation</h2> * <p> * Since 3.0, you're able to cancel a background task by calling * <code>BackgroundExecutor.cancelAll("id")</code> where "id" matches the * {@link #id()} value. * * </p> * <blockquote> * * <b>Example</b> : * * <pre> * @EBean * public class MyBean { * private static final String TASK_ID = "task1"; * * @Background(id = TASK_ID) * void launchTask() { * // ... * } * * void stopTask() { * BackgroundExecutor.cancelAll(TASK_ID); * } * * } * </pre> * * </blockquote> * <p> * <b>Note</b>: Cancellation may or may not be successful. If the task wasn't * executed yet, it will be removed from the pool. But it could fail if task has * already completed, has already been cancelled, or could not be cancelled for * some other reason. See {@link java.util.concurrent.Future#cancel(boolean) * Future#cancel(boolean)} for more information. * </p> * * <h2>Execution flow</h2> * <p> * By default, all tasks will be put in a * {@link java.util.concurrent.ScheduledThreadPoolExecutor * ScheduledThreadPoolExecutor} with a core pool size of * <code>2 * numberOfCpu</code>. Which means that background methods will be * executed in <b>PARALLEL</b>. You can change this by calling * <code>BackgroundExecutor.setExecutor(...)</code>. * </p> * <p> * If you want execute ALL background methods SEQUENTIALLY, the best way is to * change the executor of {@link org.androidannotations.api.BackgroundExecutor * BackgroundExecutor} to a * {@link java.util.concurrent.ScheduledThreadPoolExecutor * ScheduledThreadPoolExecutor} with a core pool size of <code>1</code>. * </p> * <p> * If you want execute some background methods SEQUENTIALLY, you should simply * use {@link #serial()} field. All task with the same serial key will be * executed sequentially. * </p> * * <blockquote> * * <b>Example 1</b> (all tasks executed sequentially) : * * <pre> * @EBean * public class MyBean { * * static { * BackgroundExecutor.setExecutor(Executors.newScheduledThreadPool(1)); * } * * private int i = 0; * * void launchTasks() { * backgroundTask(); * backgroundTask(); * backgroundTask(); * } * * @Background * void backgroundTask() { * Log.i("AA", "i = ", i++); * } * } * </pre> * * <b>Example 2</b> (some tasks executed sequentially) : * * <pre> * @EBean * public class MyBean { * * private int i = 0; * * void launchTasks() { * backgroundTask(); * backgroundTask(); * backgroundTask(); * } * * @Background(serial = "sequence1") * void backgroundTask() { * Log.i("AA", "i = ", i++); * } * } * </pre> * * </blockquote> * * * <h2>Delay</h2> * <p> * Sometimes you may want to delay execution of a background method. To do so, * you should use the {@link #delay()} field. * </p> * <b>Example</b> : * * <blockquote> * * <pre> * @EBean * public class MyBean { * * @Background(delay = 2000) * void backgroundTask() { * // ... * } * } * </pre> * * </blockquote> * * * @see UiThread * @see org.androidannotations.api.BackgroundExecutor */ @Retention(RetentionPolicy.CLASS) @Target(ElementType.METHOD) public @interface Background { /** * Identifier for task cancellation. * * To cancel all tasks having a specified background id: * * <pre> * boolean mayInterruptIfRunning = true; * BackgroundExecutor.cancelAll("my_background_id", mayInterruptIfRunning); * </pre> * * @return the task id for cancellation **/ String id() default ""; /** * Minimum delay, in milliseconds, before the background task is executed. * * @return the delay of the execution */ long delay() default 0; /** * Serial execution group. * * All background tasks having the same <code>serial</code> will be executed * sequentially. * * @return the serial execution group **/ String serial() default ""; }