1ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin/* 2ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin * Copyright (C) 2012 The Android Open Source Project 3ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin * 4ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin * you may not use this file except in compliance with the License. 6ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin * You may obtain a copy of the License at 7ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin * 8ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 9ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin * 10ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin * Unless required by applicable law or agreed to in writing, software 11ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin * See the License for the specific language governing permissions and 14ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin * limitations under the License. 15ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin */ 16ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin 17ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Linpackage com.android.gallery3d.common; 18ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin 19ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Linimport android.os.AsyncTask; 20ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Linimport android.os.Build; 21ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin 22ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Linimport java.lang.reflect.InvocationTargetException; 23ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Linimport java.lang.reflect.Method; 24ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Linimport java.util.concurrent.Executor; 25ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin 26ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin/** 27ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin * Helper class to execute an AsyncTask in parallel if SDK version is 11 or newer. 28ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin */ 29ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Linpublic class AsyncTaskUtil { 30ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin private static Method sMethodExecuteOnExecutor; 31ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin private static Executor sExecutor; 32ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin static { 33ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin if (Build.VERSION.SDK_INT >= 11) { 34ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin try { 35ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin sExecutor = (Executor) AsyncTask.class.getField("THREAD_POOL_EXECUTOR") 36ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin .get(null); 37ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin sMethodExecuteOnExecutor = AsyncTask.class.getMethod( 38ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin "executeOnExecutor", Executor.class, Object[].class); 39ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin } catch (IllegalAccessException e) { 40ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin throw new RuntimeException(e); 41ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin } catch (NoSuchFieldException e) { 42ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin throw new RuntimeException(e); 43ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin } catch (NoSuchMethodException e) { 44ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin throw new RuntimeException(e); 45ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin } 46ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin } 47ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin } 48ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin 49ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin public static <Param> void executeInParallel(AsyncTask<Param, ?, ?> task, Param... params) { 50ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin if (Build.VERSION.SDK_INT < 11) { 51ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin task.execute(params); 52ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin } else { 53ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin try { 54ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin sMethodExecuteOnExecutor.invoke(task, sExecutor, params); 55ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin } catch (IllegalAccessException e) { 56ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin throw new RuntimeException(e); 57ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin } catch (InvocationTargetException e) { 58ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin throw new RuntimeException(e); 59ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin } 60ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin } 61ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin } 62ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin 63ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin private AsyncTaskUtil() { 64ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin } 65ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin} 66ed97d58f2028938aeb3e49c10ac598cc3e7a28c6Owen Lin 67