待辦事項:
所謂待辦事項就是app登陸之後要做的List。 一般來說,登陸的手勢彈窗,實名認證彈窗,
投保彈窗。強制更新,灰度更新,都可以加入到待辦事項的列表來。
待辦事項分爲本地代辦和遠程代辦,優先級也是通過一個字段來決定先後順序(這裏是數值越小,優先級越高)
//請求網絡待辦事項:
http://xxxxxxx/work/common/queryTaskInWaiting,
//遠程待辦事項列表:
response={"code":"000000","data":{"taskList":[]},"msg":"交易成功"}
//保存在本地的待辦事項列表:
popup.cfg:
{
"localTask":[
{
"idTask":"",
"customerId":"",
"eventId":"setGesture",
"eventStep":"",
"eventStatus":"0",
"eventPri":"1011",
"createDate":"",
"updateDate":"",
"createUser":"",
"updateUser":""
}
]
}
目前的話只有本地有一個待辦事項,就是登錄手勢的,那麼來看看手勢待辦事項的業務代碼:
class GestureHandler extends PendingTaskBaseHanlder {
private static final String SET_GESTURE = "setGesture";//設置手勢密碼引導
@Override
public boolean canHandle(PendingTaskResult pendingTaskResult) {
return null != pendingTaskResult && SET_GESTURE.equals(pendingTaskResult.getEventId());
}
/**
* 處理手勢密碼登錄
* @param pendingTaskResult
*/
@Override
public void handleTask(PendingTaskResult pendingTaskResult) {
DataBus.getDefault().post(ModuleConstants.MODULE_ID_LOGIN, DataBusEvent.EV_UI_REQUEST_LOGIN,"showWramPromptDialog",null,null);
}
}
待辦事項管理器初始化的時候添加了一個默認手勢的待辦事項進來
public class PendingTaskManager {
private final Context context;
private static PendingTaskManager pendingTaskManager;
private ArrayList<PendingTaskBaseHanlder> pendingTaskBaseHanlders = new ArrayList<>();
public static PendingTaskManager getInstance(){
if(null == pendingTaskManager) {
synchronized (PendingTaskManager.class) {
if (null == pendingTaskManager) {
pendingTaskManager = new PendingTaskManager();
}
}
}
return pendingTaskManager;
}
private PendingTaskManager() {
context = AppUtils.getInstance().getContext().getApplicationContext();
addDefaultPendingTaskHanlder();
}
/**
* 添加默認事項處理器
*/
private void addDefaultPendingTaskHanlder(){
pendingTaskBaseHanlders.add(new BankAccountHandler());
pendingTaskBaseHanlders.add(new GestureHandler());
// pendingTaskBaseHanlders.add(new IDCardExpiredHandler());
pendingTaskBaseHanlders.add(new RealNameVerifyHandler());
}
/**
* 添加任務處理器
* @param pendingTaskBaseHanlder
*/
public void addPendingTaskHanlder(PendingTaskBaseHanlder pendingTaskBaseHanlder){
pendingTaskBaseHanlders.add(pendingTaskBaseHanlder);
}
/**
* 清除任務處理器列表
*/
public void clearPendingTaskHanlder(){
pendingTaskBaseHanlders.clear();
}
/**
* 移出任務處理器
* @param pendingTaskBaseHanlder
* @return
*/
public boolean removePendingTaskHanlder(PendingTaskBaseHanlder pendingTaskBaseHanlder){
return pendingTaskBaseHanlders.remove(pendingTaskBaseHanlder);
}
/**
* 登錄後待辦事項的處理開始,其他module不應該調用此方法//TODO 控制訪問權限
*/
public void handleLoginInPendingTask() {
Map<String, String> params = new HashMap<>();
String url = context.getResources().getString(R.string.QUERY_PENDING_TASKS);
NetworkDelegate.getInstance(context, Config.CFG_NETWORK_ASYNC).request((UrlFactory.BASE_URL+url), params, NetworkDelegate.ACTION_POST, new FHttpCallback<PendingTaskResultList>(false) {
@Override
public void callback(final PendingTaskResultList result) {
if (result.getCode().equals(ResponseCode.ERROR_CODE_SUCCESS)) {
//獲取最高優先級事項
ArrayList<PendingTaskResult> remoteTasks = result.getData().getTaskList();
ArrayList<PendingTaskResult> localTasks = getLocalTasks();
PendingTaskResult pendingTaskResult = getHighestPriTask(remoteTasks, localTasks);
//處理待辦事項
if( null != pendingTaskResult ) {
CopyOnWriteArrayList<PendingTaskBaseHanlder> hanlders = new CopyOnWriteArrayList<>(pendingTaskBaseHanlders);
for (int i = hanlders.size() - 1; i >= 0; i--) {
PendingTaskBaseHanlder pendingTaskBaseHanlder = hanlders.get(i);
if (pendingTaskBaseHanlder.canHandle(pendingTaskResult)){
pendingTaskBaseHanlder.handleTask(pendingTaskResult);
break;
}
}
}
}
}
@Override
public void error(String errorCode, String errorMessage) {
super.error(errorCode, errorMessage);
}
}, PendingTaskResultList.class);
}
/**
* @return 本地待辦事項列表
*/
private ArrayList<PendingTaskResult> getLocalTasks() {
ArrayList<PendingTaskResult> pendingTaskResults = null;
PopupConfig config = null;
try {
InputStream inputStream = context.getAssets().open(PopupConstant.CONFIG_FILE_NAME);
String content = FileUtils.loadTextAndClose(inputStream, "utf-8");
if (!TextUtils.isEmpty(content)) {
config = HFJson.parse(content, PopupConfig.class);
}
if (null != config) {
pendingTaskResults = config.getLocalTask();
}
} catch (Exception e) {
}
return pendingTaskResults;
}
/**
*
* @param remoteTasks
* @param localTasks
* @return 返回最高優先級待辦事項
*/
private PendingTaskResult getHighestPriTask(ArrayList<PendingTaskResult> remoteTasks, ArrayList<PendingTaskResult> localTasks) {
PendingTaskResult resultRtn = null;
//判斷服務器待辦最高優先級,數字越小優先級越高
if (null != remoteTasks) {
for (int i=0; i < remoteTasks.size(); i++) {
if( null == resultRtn || (null != resultRtn.getEventPri() && null != remoteTasks.get(i).getEventPri() && Integer.valueOf(resultRtn.getEventPri()) > Integer.valueOf(remoteTasks.get(i).getEventPri())) ) {
resultRtn = remoteTasks.get(i);
}
}
}
//判斷本地待辦最高優先級
if (null != localTasks) {
for (int i=0; i < localTasks.size(); i++) {
if( null == resultRtn || (null != resultRtn.getEventPri() && null != localTasks.get(i).getEventPri() && Integer.valueOf(resultRtn.getEventPri()) > Integer.valueOf(localTasks.get(i).getEventPri())) ) {
resultRtn = localTasks.get(i);
}
}
}
return resultRtn;
}
}
那麼問題來了,是誰觸發的呢?看看僞代碼你就知道了。我想你應該已經知道了把。EventBus
public class NotifyLoginMonitor implements IDataBusModule {
private static final String TAG = NotifyLoginMonitor.class.getSimpleName();
private static boolean register = false;
public NotifyLoginMonitor() {
synchronized (NotifyLoginMonitor.class) {
if( !register ) {
EventBus.getDefault().register(this);
register = true;
}
}
}
@Override
public void doEvent(DataBusEvent event) {
}
public void onEventMainThread(MainBusEvent event){
switch (event.getType()) {
case MainBusEvent.EV_HOME_LOGIN_CHANGE: {
if (LoginManager.isLogin()) {
PendingTaskManager.getInstance().handleLoginInPendingTask();//另外一種處理方式
}
break;
}
}
}
}