public static interface Task.OnFinishedListener
111 | Project
执行结束的回调。限定符和类型 | 128 |方法和说明 | 129 |
---|---|
void |
132 | onStartUpFinished()
133 | 当
134 | Project 执行结束时,调用该函数。 |
135 |
void onStartUpFinished()158 |
Project
执行结束时,调用该函数。接口 | 90 |说明 | 91 |
---|---|
Task.OnFinishedListener | 95 |
96 | Project 执行结束的回调。 |
98 |
类 | 107 |说明 | 108 |
---|---|
AlphaLog | 112 |
113 | 日志输出类
114 | Created by zhangshuliang.zsl on 15/8/24.
115 | |
116 |
AlphaManager | 119 |
120 | 这个类的职责是将由构造完成的
121 | Project 配置不同的模式,满足不同的进程有不同的初始化的需要。 |
122 |
AlphaUtils | 125 |
126 | 通用工具类
127 | Created by zhangshuliang.zsl on 15/8/27.
128 | |
129 |
Task | 132 |
133 | 这个类将一个个关联的
134 | Task ,组织成PERT网路图的方式进行执行。 |
135 |
Task.ProjectBuilder | 138 |
139 | 通过
140 | ProjectBuilder 将多个Task 组成一个Project 。 |
141 |
限定符和类型 | 97 |常量字段 | 98 |值 | 99 |
---|---|---|
103 |
104 | public static final java.lang.String |
105 | GLOBAL_TAG |
106 | "AlphaStartup" |
107 |
限定符和类型 | 116 |常量字段 | 117 |值 | 118 |
---|---|---|
122 |
123 | public static final int |
124 | ALL_PROCESS_MODE |
125 | 3 |
126 |
129 |
130 | public static final int |
131 | MAIN_PROCESS_MODE |
132 | 1 |
133 |
136 |
137 | public static final int |
138 | SECONDARY_PROCESS_MODE |
139 | 2 |
140 |
限定符和类型 | 149 |常量字段 | 150 |值 | 151 |
---|---|---|
155 |
156 | public static final int |
157 | STATE_FINISHED |
158 | 2 |
159 |
162 |
163 | public static final int |
164 | STATE_IDLE |
165 | 0 |
166 |
169 |
170 | public static final int |
171 | STATE_RUNNING |
172 | 1 |
173 |
每个程序包都有一个页面, 其中包含它的类和接口的列表及其概要。此页面可以包含六个类别:
89 |每个类, 接口, 嵌套类和嵌套接口都有各自的页面。其中每个页面都由三部分 (类/接口说明, 概要表, 以及详细的成员说明) 组成:
101 |每个概要条目都包含该项目的详细说明的第一句。概要条目按字母顺序排列, 而详细说明则按其在源代码中出现的顺序排列。这样保持了程序员所建立的逻辑分组。
121 |每个注释类型都有各自的页面, 其中包含以下部分:
125 |每个枚举都有各自的页面, 其中包含以下部分:
136 |对于所有程序包, 有一个 类分层结构 页面, 以及每个程序包的分层结构。每个分层结构页面都包含类的列表和接口的列表。从 java.lang.Object
开始, 按继承结构对类进行排列。接口不从 java.lang.Object
继承。
已过时的 API 页面列出了所有已过时的 API。一般由于进行了改进并且通常提供了替代的 API, 所以建议不要使用已过时的 API。在将来的实现过程中, 可能会删除已过时的 API。
154 |索引 包含按字母顺序排列的所有类, 接口, 构造器, 方法和字段的列表。
158 |这些链接使您可以转至下一个或上一个类, 接口, 程序包或相关页面。
162 |这些链接用于显示和隐藏 HTML 框架。所有页面均具有有框架和无框架两种显示方式。
166 |所有类链接显示所有类和接口 (除了非静态嵌套类型)。
170 |每个可序列化或可外部化的类都有其序列化字段和方法的说明。此信息对重新实现者有用, 而对使用 API 的开发者则没有什么用处。尽管导航栏中没有链接, 但您可以通过下列方式获取此信息: 转至任何序列化类, 然后单击类说明的 "另请参阅" 部分中的 "序列化表格"。
174 |常量字段值页面列出了静态最终字段及其值。
178 |Project
执行结束的监听。Project
的名称。Task
的任务,这里会调用用户自定义的Task.run()
。Task
执行状态,Task
已经执行完毕Task
执行状态,Task
尚未执行Task
执行状态,Task
正在执行中Task
,组织成PERT网路图的方式进行执行。Task
对象,必须要传入name
,便于确定当前是在哪一个任务中。Task
对象。Project
执行结束的回调。ProjectBuilder
将多个Task
组成一个Project
。ProjectBuilder
实例。Closeable
object safely.Cursor
object safely.Project
实例。Task
执行的状态。Task
已经完成,即状态是否是Task.STATE_FINISHED
Task
是否正在运行,即状态是否是Task.STATE_RUNNING
Project
执行结束时,调用该函数。Alpha的配置类
30 | * Created by zhangshuliang.zsl on 15/10/30. 31 | */ 32 | public class AlphaConfig { 33 | 34 | /** 35 | * 日志输出开关,默认是打开的 36 | */ 37 | private static boolean sIsLoggable = true; 38 | private static int sCoreThreadNum = Runtime.getRuntime().availableProcessors(); 39 | private static ThreadFactory sThreadFactory; 40 | private static ExecutorService sExecutor; 41 | private static int sWarningTime = 400; 42 | private static boolean sShowToastToAlarm = false; 43 | private static Context sContext; 44 | 45 | //============================================================================================== 46 | // PUBLIC API 47 | //============================================================================================== 48 | 49 | /** 50 | * 设置执行{@code task}的线程池的核心线程数,默认是CPU数。 51 | * 52 | * @param coreThreadNum 核心线程数 53 | */ 54 | public static void setCoreThreadNum(int coreThreadNum) { 55 | sCoreThreadNum = coreThreadNum; 56 | } 57 | 58 | /** 59 | * 设置执行{@code task}的线程池的{@code ThreadFactory},默认会有一个{@code ThreadFactory},将创建的 60 | * {@code Thread}命名为“Alpha Thread #num”。 61 | * 62 | * @param threadFactory 执行{@code task}的线程池的{@code ThreadFactory} 63 | */ 64 | public static void setThreadFactory(ThreadFactory threadFactory) { 65 | sThreadFactory = threadFactory; 66 | } 67 | 68 | /** 69 | * 设置执行{@code task}的线程池,默认线程池,核心线程池数是CPU数,缓存队列无穷大。包括核心线程在内,当线程空闲 70 | * 超过1分钟,会将线程释放。 71 | * 72 | * @param executorService 执行{@code task}的线程池 73 | */ 74 | public static void setExecutorService(ExecutorService executorService) { 75 | sExecutor = executorService; 76 | } 77 | 78 | /** 79 | * 设置日志输出开关,默认是打开的 80 | * @param isLoggable {@code true}开启日志,否则关闭日志。 81 | */ 82 | public static void setLoggable(boolean isLoggable) { 83 | sIsLoggable = isLoggable; 84 | } 85 | 86 | /** 87 | * 设置{@code task}执行时间的境界值,超过这个警戒值,则会通过toast来告警。默认值是400毫秒。 88 | * 89 | * @param warningTime {@code task}执行时间的境界值 90 | */ 91 | public static void setWarningTime(int warningTime) { 92 | sWarningTime = warningTime; 93 | } 94 | 95 | /** 96 | * 设置是否通过弹出toast来告警,默认值是{@code false}。 97 | * 98 | * @param context show toast需要Context实例。 99 | * @param showToastToAlarm {@code true}会弹出toast来告警,否则不会。 100 | */ 101 | public static void setShowToastToAlarm(Context context, boolean showToastToAlarm) { 102 | sContext = context; 103 | sShowToastToAlarm = showToastToAlarm; 104 | } 105 | 106 | 107 | //============================================================================================== 108 | // INNER API 109 | //============================================================================================== 110 | 111 | /*package*/ static boolean isLoggable() { 112 | return sIsLoggable; 113 | } 114 | 115 | /*package*/ static ThreadFactory getThreadFactory() { 116 | if (sThreadFactory == null) { 117 | sThreadFactory = getDefaultThreadFactory(); 118 | } 119 | 120 | return sThreadFactory; 121 | } 122 | 123 | /*package*/ static ExecutorService getExecutor() { 124 | if (sExecutor == null) { 125 | sExecutor = getDefaultExecutor(); 126 | } 127 | 128 | return sExecutor; 129 | } 130 | 131 | /*package*/ static int getWarmingTime() { 132 | return sWarningTime; 133 | } 134 | 135 | /*package*/ static boolean shouldShowToastToAlarm() { 136 | return sShowToastToAlarm; 137 | } 138 | 139 | /*package*/ static Context getContext() { 140 | return sContext; 141 | } 142 | 143 | 144 | private static ThreadFactory getDefaultThreadFactory() { 145 | ThreadFactory defaultFactory = new ThreadFactory() { 146 | private final AtomicInteger mCount = new AtomicInteger(1); 147 | 148 | public Thread newThread(Runnable r) { 149 | return new Thread(r, "Alpha Thread #" + mCount.getAndIncrement()); 150 | } 151 | }; 152 | 153 | return defaultFactory; 154 | } 155 | 156 | //============================================================================================== 157 | // PRIVATE METHOD 158 | //============================================================================================== 159 | 160 | private static ExecutorService getDefaultExecutor() { 161 | ThreadPoolExecutor executor = new ThreadPoolExecutor(sCoreThreadNum, sCoreThreadNum, 162 | 60L, TimeUnit.SECONDS, 163 | new LinkedBlockingQueue日志输出类,其函数和{@link Log}基本一致。
23 | * 24 | * Created by zhangshuliang.zsl on 15/8/24. 25 | */ 26 | public class AlphaLog { 27 | 28 | /** 29 | * 全局的日志过滤tag,{@code Alpha}库输出的日志,都可以用该tag过滤 30 | */ 31 | public static final String GLOBAL_TAG = "==ALPHA=="; 32 | 33 | public static void d(String tag, Object obj) { 34 | if (AlphaConfig.isLoggable()) { 35 | Log.d(tag, obj.toString()); 36 | } 37 | } 38 | 39 | public static void d(String tag, String msg, Object... args) { 40 | if (AlphaConfig.isLoggable()) { 41 | String formattedMsg = String.format(msg, args); 42 | Log.d(tag, formattedMsg); 43 | } 44 | } 45 | 46 | public static void d(String msg, Object... args) { 47 | d(GLOBAL_TAG, msg, args); 48 | } 49 | 50 | public static void e(String tag, Object obj) { 51 | if (AlphaConfig.isLoggable()) { 52 | Log.e(tag, obj.toString()); 53 | } 54 | } 55 | 56 | 57 | public static void e(String tag, String msg, Object... args) { 58 | if (AlphaConfig.isLoggable()) { 59 | String formattedMsg = String.format(msg, args); 60 | Log.e(tag, formattedMsg); 61 | } 62 | } 63 | 64 | 65 | public static void i(String tag, Object obj) { 66 | if (AlphaConfig.isLoggable()) { 67 | Log.i(tag, obj.toString()); 68 | } 69 | } 70 | 71 | public static void w(Exception e) { 72 | if (AlphaConfig.isLoggable()) { 73 | e.printStackTrace(); 74 | } 75 | } 76 | 77 | public static void print(Object msg) { 78 | d(GLOBAL_TAG, msg); 79 | } 80 | 81 | public static void print(String msg, Object... args) { 82 | d(GLOBAL_TAG, msg, args); 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /alpha/src/main/java/com/alibaba/android/alpha/AlphaUtils.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 Alibaba Group. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package com.alibaba.android.alpha; 18 | 19 | import android.app.ActivityManager; 20 | import android.content.Context; 21 | import android.database.Cursor; 22 | import android.text.TextUtils; 23 | 24 | import java.io.Closeable; 25 | import java.io.FileInputStream; 26 | import java.util.Collections; 27 | import java.util.Comparator; 28 | import java.util.List; 29 | 30 | import static com.alibaba.android.alpha.AlphaManager.ALL_PROCESS_MODE; 31 | import static com.alibaba.android.alpha.AlphaManager.MAIN_PROCESS_MODE; 32 | import static com.alibaba.android.alpha.AlphaManager.SECONDARY_PROCESS_MODE; 33 | 34 | /** 35 | *通用工具类。
36 | * 37 | * Created by zhangshuliang.zsl on 15/8/27. 38 | */ 39 | public class AlphaUtils { 40 | 41 | private static Comparator监控{@code Project}执行性能的类。会记录每一个{@code Task}执行时间,以及整个{@code Project}执行时间。
28 | * Created by zhangshuliang.zsl on 15/11/4. 29 | */ 30 | class ExecuteMonitor { 31 | private Map在编码过程中,我们通常会有这样的需要{@code Map
注意:目前{@code ListMultiMap}不是一个{@code Map}类型。
28 | * Created by zhangshuliang.zsl on 15/9/30. 29 | */ 30 | public class ListMultiMap获取{@code Project}执行性能记录的回调
23 | * Created by zhangshuliang.zsl on 15/11/4. 24 | */ 25 | public interface OnGetMonitorRecordCallback { 26 | 27 | /** 28 | * 获取{@code task}执行的耗时。 29 | * @param result {@code task}执行的耗时。{@code key}是{@code task}名称,{@code value}是{@code task}执行耗时,单位是毫秒。 30 | */ 31 | public void onGetTaskExecuteRecord(Map
21 | * {@code Project}执行生命周期的回调。
22 | * 注意:回调接口要考虑线程安全问题。
23 | *
日志输出类,其函数和{@link Log}基本一致。
23 | * 24 | * Created by zhangshuliang.zsl on 15/8/24. 25 | */ 26 | public class MyLog { 27 | 28 | /** 29 | * 全局的日志过滤tag,{@code Alpha}库输出的日志,都可以用该tag过滤 30 | */ 31 | public static final String GLOBAL_TAG = "==ALPHA=="; 32 | 33 | private static StringBuilder mLogString = new StringBuilder(); 34 | 35 | public static void d(String tag, Object obj) { 36 | Log.d(tag, obj.toString()); 37 | mLogString.append(obj.toString()).append("\n"); 38 | } 39 | 40 | public static synchronized String getLogString() { 41 | return mLogString.toString(); 42 | } 43 | 44 | public static synchronized void d(String tag, String msg, Object... args) { 45 | String formattedMsg = String.format(msg, args); 46 | mLogString.append(formattedMsg).append("\n"); 47 | Log.d(tag, formattedMsg); 48 | } 49 | 50 | public static void e(String tag, Object obj) { 51 | Log.e(tag, obj.toString()); 52 | mLogString.append(obj.toString()).append("\n"); 53 | } 54 | 55 | public static void print(Object msg) { 56 | d(GLOBAL_TAG, msg); 57 | } 58 | 59 | public static void print(String msg, Object... args) { 60 | d(GLOBAL_TAG, msg, args); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /sample/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 16 | 17 |