CC框架實踐(1):實現登錄成功再進入目標界面功能

在掘金上看到這篇文章:android 關于先登錄成功后再進入目標界面的思考,作者對實現登錄成功后再跳轉到目標界面功能作了比較詳細的分析,對比了一些已有的實現方案并指出存在的問題。最終,作者實現了一個可同時添加多個條件判斷攔截的方案,思路很新穎。

這篇文章的閱讀量和喜歡數都很多,看來大家對這個需求的關注度很高,這里將我們在使用 CC框架 過程中實現這個功能的方案跟大家分享一下。

快速了解CC

  • 是一套基于組件總線的組件化實施方案
  • 一靜一動,開發時運行2個app,業務環境始終是完整的:

    • 靜:主App (通過跨App的方式調用單組件App內的組件)
    • 動:正在開發中的單組件App (通過跨App的方式調用主App內的組件)
  • 支持漸進式組件化改造

    • 解耦只是過程,而不是前提

CC框架基因中自帶支持組件層面的AOP

在定義組件時,實現IComponent.onCall(cc)方法,并根據cc中的參數來執行組件中的具體邏輯(如:頁面跳轉等)。

可以在調用具體邏輯之前對該功能進行AOP實現,例如:登錄、頁面數據預加載等

用CC框架實現必須先登錄再進入目標頁面功能

目標頁面所在的組件在執行頁面跳轉前調用登錄組件(用戶中心組件)獲取用戶信息,若未登錄則登錄后返回用戶信息。

這里有2個點:
1. 若用戶已登錄,則直接返回用戶信息,同步方式實現即可
2. 若用戶未登錄,則跳轉到登錄頁面,需要執行完登錄操作(或取消)后才能獲得結果,使用異步方式實現。

以打開訂單列表頁面前需要登錄為例:

  1. 先定義用戶組件,提供一個強制獲取用戶登錄信息的功能,若未登錄則打開登錄界面,并在用戶登錄后返回登錄結果(取消登錄也是一種結果)
//用戶中心組件類
public class UserComponent implements IComponent {@Overridepublic String getName() {return "demo.component.user";}@Overridepublic boolean onCall(CC cc) {String actionName = cc.getActionName();// ... // 強制獲取用戶信息,若未登錄則跳轉到登錄,并將登錄結果返回if ("forceGetLoginUser".equals(actionName)) {if (!TextUtils.isEmpty(Global.loginUserName)) {//已登錄同步實現,直接調用CC.sendCCResult(...)并返回返回falseCCResult result = CCResult.success(Global.KEY_USERNAME, Global.loginUserName);CC.sendCCResult(cc.getCallId(), result);return false;}//未登錄,打開登錄界面,在登錄完成后再回調結果,異步實現Context context = cc.getContext();Intent intent = new Intent(context, LoginActivity.class);if (!(context instanceof Activity)) {//調用方沒有設置context或app間組件跳轉,context為applicationintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);}//將cc的callId傳給Activity,登錄完成后通過這個callId來回傳結果intent.putExtra("callId", cc.getCallId());context.startActivity(intent);//異步實現,不立即調用CC.sendCCResult,返回truereturn true;}//...return false;}}
  1. 模擬的登錄頁面:點擊按鈕模擬登錄,直接返回文本框中的信息作為登錄成功的信息,若未登錄直接返回,則視為取消登錄
/*** 模擬登錄頁面*/
public class LoginActivity extends AppCompatActivity implements View.OnClickListener {private EditText editText;private String callId;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.id.activity_login);callId = intent.getStringExtra("callId");//init views}@Overridepublic void onClick(View v) {//模擬登錄:點擊按鈕獲取文本框內容并作為用戶登錄信息返回String username = editText.getText().toString().trim();if (TextUtils.isEmpty(username)) {Toast.makeText(this, R.string.demo_b_username_hint, Toast.LENGTH_SHORT).show();} else {//登錄成功,返回Global.loginUserName = username;finish();}}@Overrideprotected void onDestroy() {super.onDestroy();//判斷是否為CC調用打開本頁面if (callId != null) {CCResult result;if (TextUtils.isEmpty(Global.loginUserName)) {result = CCResult.error("login canceled");} else {result = CCResult.success(Global.KEY_USERNAME, Global.loginUserName);}//為確保不管登錄成功與否都會調用CC.sendCCResult,在onDestroy方法中調用CC.sendCCResult(callId, result);}}
}
  1. 在訂單組件中進行登錄驗證:登錄成功,則跳轉到訂單列表頁;登錄失敗,則返回調用失敗的結果
//訂單組件
public class OrderComponent implements IComponent {@Overridepublic String getName() {return "demo.component.order";}@Overridepublic boolean onCall(CC cc) {CCResult result = CC.obtainBuilder("demo.component.user").setActionName("forceGetLoginUser").build().call();CCResult ccResult;// 根據登錄狀態決定是否打開頁面// 這里也可以添加更多的前置判斷邏輯if (result.isSuccess()) {ccResult = CCResult.success();//登錄成功,打開目標頁面startOrderListActivity(cc);} else {//登錄失敗,返回失敗信息ccResult = result;}//調用方不需要獲得額外的信息,只需要知道調用狀態//所以這個組件采用同步實現:同步調用CC.sendCCResult(...) 并且返回falseCC.sendCCResult(cc.getCallId(), ccResult);return false;}private void startOrderListActivity(CC cc) {Context context = cc.getContext();Intent intent = new Intent(context, OrderListActivity.class);if (!(context instanceof Activity)) {// context maybe an application object if caller dose not setContext// or call across appsintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);}context.startActivity(intent);}
}

至此,打開訂單頁面必須登錄的功能已全部完成。

這樣實現的好處

  1. 登錄組件只管登錄自身的邏輯,跟其它邏輯完全不耦合
  2. 調用訂單組件的地方無需添加額外的代碼
  3. 可以添加任意的前置條件判斷
  4. 登錄條件的判斷可用于任意組件而無需修改登錄組件的邏輯
  5. 支持跨app組件調用時的前置條件判斷

了解更多關于CC框架的信息

Github源碼 ,持續維護更新中, 歡迎watch、fork、star、pr、提issue

系列文章

CC:基于組件總線的Android組件化開源框架

CC框架實踐(1):實現登錄成功再進入目標界面功能

CC框架實踐(2):Fragment和View的組件化

CC框架實踐(3): 讓jsBridge更優雅

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282954.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282954.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282954.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

yum search php7,yum install php7 in centos6

如果有安裝的PHP包,先刪除他們yum list installed | grep phpyum remove php.x86_64 php-cli.x86_64 php-common.x86_64 php-gd.x86_64 php-ldap.x86_64 php-mbstring.x86_64 php-mcrypt.x86_64 php-mysql.x86_64 php-pdo.x86_64yum 安裝我們需要的軟件1.安裝epel軟…

CentOS 7系統安裝配置圖解教程

操作系統:CentOS 7.3 備注: CentOS 7.x系列只有64位系統,沒有32位。生產服務器建議安裝CentOS-7-x86_64-Minimal-1611.iso版本 一、安裝CentOS 7.3 成功引導系統后,會出現下面的界面 界面說明: Install CentOS 7 #安裝…

這份《.NET/C#面試手冊》超神啦!

這幾天給.neter們整理了一份《.NET/C#面試手冊》,目前大約4萬字左右,初衷也很簡單,就是希望在面試的時候能夠幫助到大家,減輕大家的負擔和節省時間。對于沒有跳槽打算的也可以復習一下相關知識點,就當是查缺補漏&#…

Dinic算法----最大流常用算法之一

——沒有什么是一個BFS或一個DFS解決不了的;如果有,那就兩個一起。 最大流的$EK$算法雖然簡單,但時間復雜度是$O(nm^2)$,在競賽中不太常用。 競賽中常用的$Dinic$算法和$SAP$,其實也不太難。 那么,$Dinic$算…

springcloud~Eureka實例搭建

服務端 build.gradle配置 dependencies {compile(org.springframework.cloud:spring-cloud-starter-netflix-eureka-server)testCompile(org.springframework.boot:spring-boot-starter-test) }dependencyManagement {imports {mavenBom "org.springframework.cloud:sprin…

php5.3教程,Php 5.3發布

PHP 5.3.4 特性: 增加對zip 流的統計支持 新增 follow_location (默認啟用)支持 增加一個 3rd parameter to get_html_translation_table Implemented FR #52348, added new constant ZEND_MULTIBYTE to detect zend multibyte at runtime. Multiple improvements t…

javascript學習筆記 null和undefined

null是javascript語言的關鍵字,它表示一個特殊值,常用來描述“空值”。對null執行typeof預算,結果返回字符串“object”,也就是說,可以將null認為是一個特殊的對象值,含義是“非對象”。但實際上&#xff0…

C# 為什么高手都是用IsNullOrWhiteSpace對字符串判空?

判斷字符串為空有好幾種方法:方法一: 代碼如下:static void Main(string[] args){string str "";if (str ""){Console.WriteLine("a is empty"); ;}Console.ReadKey();}運行結果:a is empty這樣…

使用bcftools提取指定樣本的vcf文件(extract specified samples in vcf format)

1、下載安裝bcftools。 2、準備樣本ID文件,這里命名為samplelistname.txt,一個樣本一行,如下所示: sample1 sample2 sample3 3、輸入命令: bcftools view -S samplelistname.txt /1000genomes/ALL.chr16.phase3_shapei…

iostat相關參數說明——await:平均每次設備I/O操作的等待時間 (毫秒),如果%util接近 100%,說明產生的I/O請求太多...

iostat是I/O statistics(輸入/輸出統計)的縮寫,iostat工具將對系統的磁盤操作活動進行監視。它的特點是匯報磁盤活動統計情況,同時也會匯報出 CPU使用情況。同vmstat一樣,iostat也有一個弱點,就是它不能對某…

php里面sql是什么意思,MySQL和SQL是什么?MySQL和SQL之間的區別有哪些

MySQL和SQL之間的區別有哪些?很多PHP的初學者,對MySQL,MyAdmin和SQL有什么區別并不是很清楚?下面 第一PHP社區 就帶領大家來學習一下MySQL和SQL之間的區別。【推薦閱讀:MySQL什么意思】一:什么是SQLSQL是一…

Blazor University (51)依賴注入 —— 擁有多個依賴項:錯誤的方式

原文鏈接:https://blazor-university.com/dependency-injection/component-scoped-dependencies/owning-multiple-dependencies-the-wrong-way/擁有多個依賴項:錯誤的方式OwningComponentBase[1] 類是一個合適的解決方案,當我們需要我們的組件…

Centos的yum源更換為國內的阿里云源

1、備份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2、下載新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo 或者 curl -o /etc/yum.repo…

Centos 7 搭建.net web項目

現在的.NET Core 1.0版本是一個很小的核心,APIs和工具也并不完整,但是隨著.Net Core的不斷完善,補充的Apis和創新也會一起整合到.NET Framework中。 安裝centos系統 請自行安裝或百度教程 安裝 libicu包 和 dotnet 溫馨提示:如果需…

Effective Objective-C 2.0 編寫高質量iOS與OS X代碼的52個有效方法筆記-協議與分類...

23、通過委托與數據源協議進行對象間通信 如果要在委托對象上調用可選方法,那么必須提前使用類型信息查詢方法判斷這個委托對象能否響應相關選擇子。 if ( [_delegate respondsToSelector:selector(networkFetcher:didReceiveData:)]){ [_delegate networkFetcher:s…

用matlab求解工作時間調度問題,置換流水車間調度問題的MATLAB求解.doc

物流運籌實務課程設計題目:置換流水車間調度問題的MATLAB求解置換流水車間調度問題的MATLAB求解目錄前言……………………………………………………………………… 5問題描述………………………………………………………………… 6算法設計…………………………………

EntityFrameworkCore 模型自動更新(上)

【導讀】嗯,距離上一次寫博文已經過去近整整十個月,還是有一些思考,但還是變得懶惰了,心思也不再那么專注,有點耗費時間,學習也有點停滯不前,那就順其自然,隨心所欲吧,等…

IDEA 快捷注釋

1. 新建類的注釋模板 1) File->settings->Editor->Live Templates 2) 點擊綠色號,選擇template group ,輸入group的name,然后點ok 3) 選中剛才添加的group,點擊號,選擇live Template 4) 代碼模板位置,個人用的代碼: 1 /** 2 * &…

matlab 如何hidden,Matlab基本函數-hidden函數

1、hidden函數:設置或取消隱藏線模式2、用法說明(1)hidden on 函數對當前圖形打開隱藏線條刪除,使網格圖后面的線條被前面的線條遮住。設置曲面圖形對象的屬性FaceColor為坐標軸背景顏色;(2)hidden off 函數對當前圖形關閉隱藏線條刪除&#…

java高級----Thread之CyclicBarrier的使用

CyclicBarrier是一個同步輔助類,它允許一組線程互相等待,直到到達某個公共屏障點 (common barrier point)。今天我們就學習一下CyclicBarrier的用法。 CyclicBarrier的簡單使用 類CyclicBarrier不僅有CountDownLatch所具有的功能,還可以實現屏…