Android百萬級應用重構(gòu)

本人Android實際開發(fā)工作經(jīng)驗3年磨镶,新加入一家互聯(lián)網(wǎng)公司負責項目重構(gòu)邪蛔,用戶100W+急黎,app已經(jīng)迭代開發(fā)2年之久,存在代碼結(jié)構(gòu)不清醒侧到,業(yè)務邏輯混亂勃教,命名不規(guī)范,所以進行項目重構(gòu)匠抗,重構(gòu)是一個不斷完善的過程故源,這是我前期根據(jù)項目需求定的一個框架,新手很多不足汞贸,希望多多指教哈绳军!



project端工程介紹:

1:項目業(yè)務集成基于mvp+proxy結(jié)構(gòu)

2:大部分模塊含有core為當前模塊核心結(jié)構(gòu)

2:除以下模塊還有entity印机,constant等輔助模塊


app模塊:

工程初始化:分為以下base初始化類

baseApplication:工程啟動初始化

baseActivity:頁面初始化

baseModel:工程數(shù)據(jù)模型

Briage模塊:

”橋“ 分為以下子模塊

factory:功能模塊工廠加工,組件連接

Manager:功能模塊集成

Croes模塊:

工程核心模塊门驾,mvp模式

其中v模塊:

activity:分工負責頁面生命周期與Android其他四大組件交互

layout:由各子proxyview類代理

Assemly模塊:

“組件模塊”分為三部分:service,broadcast,contentprovide

Assistant模塊:

項目幫助模塊:分為以下子模塊

Cache:工程緩存模塊

Helper:工程幫助處理模塊

Net:工程網(wǎng)絡處理模塊

security:工程安全模塊

Modles模塊:

”模型“ 模塊 分為以下子模塊:

modle:數(shù)據(jù)模型射赛,業(yè)務模型

Presenters模塊:

”交互層模塊“分為以下子模塊

adapter:適配器

prsenter:交互類

Views模塊:

”View“ 模塊‘分為以下子模塊:

cores:view模塊結(jié)構(gòu)核心

Ui:activity 頁面

window:分為fragment,dialog奶是,view

ProxyView模塊

”View代理“ 代理activity關(guān)于view一切初始化


下面Cores模塊部分代碼示例楣责,基于mvp思想,根據(jù)項目重構(gòu)實際修改:


/* --------------------------------SettingActivity.java------------------------------------------------*/

public class SettingActivity extends BaseActivity {

private SettingPresentersettingPresenter;

@Override

? ? protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_settings);

initCore();

}

@Override

? ? public void initCore() {

settingPresenter=new SettingPresenter();

settingPresenter.initCreate(this);

}

@Override

? ? public void onEventMainThread(Event event) {

super.onEventMainThread(event);

}

@Override

? ? protected void onPause() {

super.onPause();

DialogHelper.dismissDialog(settingPresenter.getSettingProxyView().mComfirmDialog);

DialogHelper.dismissDialog(settingPresenter.getSettingProxyView().mLoadingDialog);

if (settingPresenter.getSettingProxyView().activity.isFinishing()) {

settingPresenter.getSettingProxyView().mLoadingDialog =null;

settingPresenter.getSettingProxyView().mComfirmDialog =null;

}

}

@Override

? ? protected void onDestroy() {

super.onDestroy();

settingPresenter.detachView();

}

}


/* --------------------------------SettingPresenter.java---------------------------------------------*/

public class SettingPresent erextends BasePresenter {

private SettingModelsettingModel;

private SettingProxyViewsettingProxyView;

public SettingModel getSettingModel() {

return settingModel;

}

public SettingProxyView getSettingProxyView() {

return settingProxyView;

}

@Override

? ? public void initCreate(BaseActivity activity) {

settingProxyView =new SettingProxyView(activity,this);

settingModel=new SettingModel();

attachView(settingProxyView);

}

@Override

? ? public void initView() {

}

@Override

? ? public void initData() {

settingModel.addProxyView(settingProxyView);

settingModel.initRadioGroup();

}

@Override

? ? public void initEvent() {

}

@Override

? ? public void ViewOnClick(View view) {

switch (view.getId()){

case R.id.setting_check_version:

settingModel.checkNewVersion();

ClickAgentHelper.getInstance().addClickLog(ClickLog.S_LOG_CLICK_SETTING_CHECK_UPDATE);

break;

case R.id.setting_about:

Intent i =new Intent(settingProxyView.activity, AboutActivity.class);

settingProxyView.activity.startActivity(i);

ClickAgentHelper.getInstance().addClickLog(ClickLog.S_LOG_CLICK_SETTING_ABOUT);

break;

default:

break;

}

}

@Override

? ? public void ViewOnLongClick(View view) {

}

}


/* ————————————————BasePresenter.java--------------------------------------------/**

* 交互層

* <基礎業(yè)務類>*/

public abstract class BasePresenter implements Presenterlmp, ViewEventListenter {

protected ProxyViewproxyView;

public BasePresenter() {

}

public final void attachView(ProxyView proxyView) {

this.proxyView = proxyView;

initView();

initData();

initEvent();

}

public void detachView(){

LogHelper.d("detachView");

proxyView =null;

}

public abstract void initView();

public abstract void initData();

public abstract void initEvent();

@Override

? ? public String getName() {

return proxyView.getClass().getSimpleName();

}

}

/* ————————————————SettingProxyView.java-------------------------------------------

public class SettingProxyView extends ProxyView {

public DialogmLoadingDialog =null;

public DialogmComfirmDialog =null;

public RadioGroupmBBSpeedRG =null;

public RadioGroupmManYiRG =null;

public CheckBoxmSpeekWcRG =null;

public RadioGroupmNaviOrientationRG =null;

public RadioGroupmNaviDayOrNightRG =null;

public RadioGroupmNaviMapDirectionRG =null;

public RadioGroupmNaviShijiaoRG =null;

public RadioGroupmFontSizeRG =null;

public CheckBoxmIntelligentBroadcastRG =null;

public CheckBoxmUMPushRG =null;

public CheckBoxmShowLimitMarkerRG =null;

public CheckBoxmTestOpenCB =null;

public TextViewmTitle=null;

public TextViewmTips=null;

public SettingProxyView(BaseActivity activity, ViewEventListenter viewEventListenter) {

super(activity,viewEventListenter);

initView();

initViewEvent();

}

@Override

? public void initView() {

mLoadingDialog = DialogHelper.getLoadingDialog(activity);

mComfirmDialog = DialogHelper.getComfirmDialog(activity);

mTitle = (TextView) getView(R.id.nav_title);

mTips = (TextView) getView(R.id.title_tips);

mBBSpeedRG = (RadioGroup) getView(R.id.setting_voice);

mSpeekWcRG = (CheckBox)getView(R.id.setting_welcome_voice);

mNaviOrientationRG = (RadioGroup)getView(R.id.setting_screen);

mNaviDayOrNightRG = (RadioGroup)getView(R.id.setting_nav_daymode);

mIntelligentBroadcastRG = (CheckBox)getView(R.id.setting_speed);

//導航方向

? ? ? mNaviMapDirectionRG = (RadioGroup)getView(R.id.setting_nav);

//導航模式 2D聂沙,3D

? ? ? mNaviShijiaoRG = (RadioGroup)getView(R.id.setting_nav_perspective);

//字體大小

? ? ? mFontSizeRG = (RadioGroup)getView(R.id.setting_fount_size);

//推送消息

? ? ? mUMPushRG = (CheckBox)getView(R.id.setting_push_msg);

mShowLimitMarkerRG = (CheckBox)getView(R.id.setting_restricted);

mTestOpenCB = (CheckBox)getView(R.id.setting_test_open);

}

@Override

? public void initViewEvent() {

mTitle.setText(activity.getResources().getText(R.string.setting_title));

mTips.setVisibility(View.GONE);

addOnClickListenter(getView(R.id.setting_check_version));

addOnClickListenter(getView(R.id.setting_about));

}

@Override

? public void ViewOnClick(View view) {

mViewEventListenter.ViewOnClick(view);

}

@Override

? public void ViewOnLongClick(View view) {

mViewEventListenter.ViewOnLongClick(view);

}

}


/* ————————————————ProxyView.java---------------------------------------------/**

*/

public? abstract? class ProxyView ?implements View.OnClickListener,View.OnLongClickListener{

private static final StringTAG =ProxyView.class.getSimpleName();

public ViewEventListentermViewEventListenter;

/**

* 返回按鈕

*/

? private Viewback;

/**

* 標題

*/

? public TextViewtitle;

/**

* 右邊字符

*/

? public TextViewmTips;

private TextViewright;

public BaseActivityactivity;

public ProxyView(BaseActivity activity, ViewEventListenter viewEventListenter) {

this.mViewEventListenter=viewEventListenter;

this.activity=activity;

setHeader();

}

public abstract? void initView();

public abstract void initViewEvent();

public abstract void ViewOnClick(View view);

public abstract void ViewOnLongClick(View view);

public void setHeader() {

back=getView(R.id.button_back);

mTips=(TextView)getView(R.id.title_tips);

title=(TextView)getView(R.id.nav_title);

if(back!=null)addOnClickListenter(back);

}

public? void setTitle(String content){

if(title!=null)title.setText(content);

}

public? void onClickBackButton()

{

activity.finish();

}

public? View? getView(int ViewId){

return? activity.findViewById(ViewId);

}

public? void? addOnClickListenter(View view){

if (view==null)return;

view.setClickable(true);

view.setOnClickListener(this);

}

public? void? addOnLongClickListenter(View view){

view.setClickable(true);

view.setOnLongClickListener(this);

}

@Override

? public void onClick(View view) {

switch (view.getId()){

case R.id.button_back:

if (isFastClick()) {

return;

}

onClickBackButton();

break;

}

ViewOnClick(view);

}

@Override

? public boolean onLongClick(View view) {

ViewOnLongClick(view);

return false;

}

private long mLastClickTime =0;

private static final int CLICK_SPACE_TIME =800;

public boolean isFastClick() {

long currentTime = System.currentTimeMillis();

boolean isFast =false;

if (currentTime -mLastClickTime >CLICK_SPACE_TIME) {

isFast =false;

}else {

isFast =true;

}

mLastClickTime = currentTime;

return isFast;

}

}


/* ————————————————SettingModel.java--------------------------------------------

public class SettingModel implements Modlelmp {

private SettingProxyView settingProxyView;

@Override

? ? public void addProxyView(ProxyView proxyView) {

this.settingProxyView =(SettingProxyView) proxyView;

}

@Override

? ? public void initModleData() {

}

public void checkNewVersion() {}

………………………………………………..省略大量數(shù)據(jù)模型秆麸,業(yè)務邏輯代碼

………………………………………………..………………………………………………..………………………………………………..

………………………………………………..………………………………………………..………………………………………………..

}


/* ————————————————CoreFactory.java---------------------------------------------

/**

* <中間連接層>*

*/

public class CoreFactory {

private static CoreFactorymodel;

public static void init(Context context) {

model =new CoreFactory();

model.iniLocalFileStorageManager();

model.initPreferenceManager();

model.initSecurityManager();

model.initUserSession();

model.initCoreServiceManager(context);

model.initOkHttpManager();

model.initImageManager();

}

public static void destroy() {

model =null;

}

/**

* 初始化本地存儲路徑管理類

*/

? ? private void iniLocalFileStorageManager() {

BridgeLifeCycleSetKeeper.getInstance().trustBridgeLifeCycle(LocalFileStorageManager.TAG,LocalFileStorageManager.getInstance());

}

/**

* 初始化SharedPreference管理類

*/

? ? private void initPreferenceManager() {

BridgeLifeCycleSetKeeper.getInstance().trustBridgeLifeCycle(SharedPrefManager.TAG,SharedPrefManager.getInstance());

}

/**

* 網(wǎng)絡請求管理類

*/

? ? private void initOkHttpManager() {

BridgeLifeCycleSetKeeper.getInstance().trustBridgeLifeCycle(HttpManager.TAG, HttpManager.getInstance());

}

/**

* 圖片管理類

*/

? ? private void initImageManager() {

BridgeLifeCycleSetKeeper.getInstance().trustBridgeLifeCycle(ImageMangaer.TAG, ImageMangaer.getInstance());

}

/**

* 初始化安全模塊

*/

? ? private void initSecurityManager() {

}

/**

* 初始化用戶信息模塊

*/

? ? private void initUserSession() {

}

/**

* 初始化Tcp服務

*

? ? * @param context

? ? */

? ? private void initCoreServiceManager(Context context) {

}

private void initDBManager() {

}

}

正在重構(gòu)學習階段,希望能得到多多指點及汉,也希望能給大家提供一些幫助…….第一次寫博客沮趣,哈哈!?浪妗7棵!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甸箱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子迅脐,更是在濱河造成了極大的恐慌芍殖,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谴蔑,死亡現(xiàn)場離奇詭異豌骏,居然都是意外死亡,警方通過查閱死者的電腦和手機隐锭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門窃躲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钦睡,你說我怎么就攤上這事蒂窒。” “怎么了荞怒?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵洒琢,是天一觀的道長。 經(jīng)常有香客問我褐桌,道長衰抑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任荧嵌,我火速辦了婚禮呛踊,結(jié)果婚禮上砾淌,老公的妹妹穿的比我還像新娘。我一直安慰自己谭网,他們只是感情好汪厨,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蜻底,像睡著了一般骄崩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上薄辅,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天要拂,我揣著相機與錄音,去河邊找鬼站楚。 笑死脱惰,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的窿春。 我是一名探鬼主播拉一,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼旧乞!你這毒婦竟也來了蔚润?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤尺栖,失蹤者是張志新(化名)和其女友劉穎嫡纠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體延赌,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡除盏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了挫以。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片者蠕。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掐松,靈堂內(nèi)的尸體忽然破棺而出踱侣,到底是詐尸還是另有隱情,我是刑警寧澤大磺,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布泻仙,位于F島的核電站,受9級特大地震影響量没,放射性物質(zhì)發(fā)生泄漏玉转。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一殴蹄、第九天 我趴在偏房一處隱蔽的房頂上張望究抓。 院中可真熱鬧猾担,春花似錦、人聲如沸刺下。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娄涩。三九已至,卻和暖如春屿衅,著一層夾襖步出監(jiān)牢的瞬間畅卓,已是汗流浹背擅腰。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留翁潘,地道東北人趁冈。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像拜马,于是被迫代替她去往敵國和親渗勘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355