欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析Android代碼質(zhì)量管理

 更新時(shí)間:2018年05月20日 15:08:10   作者:偉峰_888  
本篇文章給大家分享了Android代碼質(zhì)量管理的相關(guān)知識(shí)點(diǎn)以及重點(diǎn)分析,對(duì)此有興趣的朋友可以參考學(xué)習(xí)下。

模板方法-基類(lèi)封裝

Activity和Fragment應(yīng)該是Android最常用的組件,對(duì)他進(jìn)行簡(jiǎn)單的封裝對(duì)提高代碼的簡(jiǎn)潔性也有很大的幫助。

BaseActivity :

public abstract class BaseActivity extends FragmentActivity {
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		init();
		findViews();
		initData();
		setListener();
		setting();
	}
	
	/**
	 * 獲得上下文
	 * @return Context
	 */
	public Context getContext(){
		return this;
	}
	
	/**
	 * 始化參數(shù)
	 */
	public abstract void init();
	/**
	 * 查找所有的控件
	 */
	public abstract void findViews();
	/**
	 * 初始化頁(yè)面數(shù)據(jù)
	 */
	public abstract void initData();
	/**
	 * 設(shè)置控件的監(jiān)聽(tīng)事件
	 */
	public abstract void setListener();
	
	/**
	 * 后續(xù)參數(shù)設(shè)置
	 */
	public abstract void setting();

}

BaseFragment :

public abstract class BaseFragment extends Fragment {


	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	}

	@Override
	public void onStart() {
		super.onStart();
		init();
		findViews();
		initData();
		setListener();
		setting();
	}

	public Context getContext() {
		return getActivity();
	}

	public abstract void init();

	public abstract void findViews();

	public abstract void initData();

	public abstract void setListener();

	public abstract void setting();

}

代碼比較簡(jiǎn)單,用到了模板設(shè)計(jì)模式,一個(gè)方法只做一樣事情,初始化的就只做初始化操作,設(shè)置監(jiān)聽(tīng)的就只設(shè)置監(jiān)聽(tīng)。不管多少個(gè)Activity\Fragment都能很好的統(tǒng)一化編碼風(fēng)格,看起來(lái)更清晰不亂。

Fragment簡(jiǎn)單管理

下面先看看標(biāo)準(zhǔn)的創(chuàng)建和管理Fragment

private void showFragment(){ 
 FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
 hideFragment(fragmentTransaction); 
 if (mFragment1== null) { 
 mFragment1 = new MyFragment1(context); 
 fragmentTransaction.add(R.id.content, mFragment1); 
 fragmentTransaction.commit(); 
 } else { 
 fragmentTransaction.show(mFragment1); 
 fragmentTransaction.commit(); 
 } 
} 

每次創(chuàng)建一個(gè)Fragment都要復(fù)制一邊這個(gè)方法,代碼冗余、不利于維護(hù)和更新。

下面封裝一下

public class FragmentFactory { 
 
 private FragmentActivity mContext; 
 private static FragmentFactory factory = new FragmentFactory(); 
 //用于存儲(chǔ)已創(chuàng)建的Fragment對(duì)象 
 private Map<String, Fragment> mFragmentMap=new HashMap<>(); 
 private int mLayoutId; 
 
 private FragmentFactory() { 
 } 
 
 public static FragmentFactory getInstance() { 
 return factory; 
 } 
 
 //layoutId 傳入布局文件的id 
 public FragmentFactory init(FragmentActivity context,int layoutId) { 
 this.mContext = context; 
 this.mLayoutId=layoutId; 
 return factory; 
 } 
 
 public Activity getParentActivity() { 
 return mContext; 
 } 
 
 
 private <T extends Fragment> Fragment createFragment(Class<T> clazz) { 
 Fragment fragment = null; 
 try { 
 fragment = getFragment(clazz.getName()); 
 FragmentTransaction fragmentTransaction = mContext.getSupportFragmentManager().beginTransaction(); 
 hideFragment(fragmentTransaction); 
 if (fragment == null) { 
 
 fragment = (Fragment) clazz.newInstance(); 
 setFragment(fragment); 
 fragmentTransaction.add(mLayoutId, fragment); 
 fragmentTransaction.commit(); 
 } else { 
 fragmentTransaction.show(fragment); 
 fragmentTransaction.commit(); 
 } 
 } catch (InstantiationException e) { 
 e.printStackTrace(); 
 } catch (IllegalAccessException e) { 
 e.printStackTrace(); 
 } 
 return fragment; 
 } 
 
 private <T extends Fragment> Fragment getFragment(String className) { 
 Fragment fragment = mFragmentMap.get(className); 
 return fragment; 
 } 
 
 private <T extends Fragment> void setFragment(Fragment fragment) throws InstantiationException, IllegalAccessException { 
 String className = fragment.getClass().getName(); 
 mFragmentMap.put(className, fragment); 
 } 
 
 private void hideFragment(FragmentTransaction fragmentTransaction) { 
 Set<String> keySet = mFragmentMap.keySet(); 
 for (String key : keySet) { 
 Fragment fragment = mFragmentMap.get(key); 
 fragmentTransaction.hide(fragment); 
 } 
 
 } 
 
 public <T extends Fragment> T showFragment(Class<T> clazz) { 
 return (T) createFragment(clazz); 
 } 
} 

調(diào)用代碼:

FragmentFactory mFragmentFactory = FragmentFactory.getInstance().init(this, R.id.fl_content); 
mFragmentFactory.showFragment(MyFragment1.class); 
mFragmentFactory.showFragment(MyFragment2.class); 

上面的封裝用到了泛型、工廠、單例等知識(shí)。只需要在Activity初始化一次對(duì)象就可以一行代碼管理Fragment了,想顯示哪個(gè)頁(yè)面就傳入對(duì)應(yīng)的Fragment的class。

簡(jiǎn)單通用的適配器

ListView是Android最常用的一個(gè)組件,優(yōu)化Litsview那就是必不可少的工作了。

用Listview最痛苦的就是寫(xiě)B(tài)aseAdapter的getView()方法,一遍又一遍的寫(xiě),大部分代碼都是重復(fù)冗余,但又不得不寫(xiě)。下面來(lái)抽取冗余的代碼封裝起來(lái)。

public abstract class CommonAdapter<T> extends BaseAdapter { 
 //需要顯示的數(shù)據(jù),List中的類(lèi)型為泛型,因?yàn)椴恢烙脩舻姆庋bBean 
 private List<T> mDatas; 
 
 private Context mContext; 
 //布局文件Id 
 private int mLayoutId; 
 public CommonAdapter(Context context,List<T> data,int layoutId) { 
 mDatas = data; 
 mContext = context; 
 mLayoutId = layoutId; 
 } 
 @Override 
 public int getCount() { 
 return mDatas.size(); 
 } 
 
 @Override 
 public Object getItem(int position) { 
 return mDatas.get(position); 
 } 
 
 @Override 
 public long getItemId(int position) { 
 return position; 
 } 
 
 @Override 
 public View getView(int position, View convertView, ViewGroup parent) { 
 ViewHolder holder = ViewHolder.getHolder(mContext,convertView, parent, mLayoutId); 
 setDatas(holder,getItem(position)); 
 return holder.getConvertView(); 
 } 
 
 /** 
 * 為各個(gè)item中的控件設(shè)置數(shù)據(jù) 
 * @param holder ViewHolder 
 * @param object 從集合中所取的一個(gè)對(duì)象 
 */ 
 public abstract void setDatas(ViewHolder holder, Object object); 
} 
public class ViewHolder { 
 private View mConvertView; 
 //用來(lái)存布局中的各個(gè)組件,以鍵值對(duì)形式 
 private HashMap<Integer,View> mViews = new HashMap<>(); 
 //ViewHolder構(gòu)造函數(shù),只有當(dāng)convertView為空的時(shí)候才創(chuàng)建 
 public ViewHolder(Context context,View convertView, ViewGroup parent, int layouId) { 
 convertView = LayoutInflater.from(context).inflate(layouId,parent,false); 
 convertView.setTag(this); //將其setTag() 
 mConvertView = convertView; 
 } 
 //返回一個(gè)ViewHolder對(duì)象 
 public static ViewHolder getHolder(Context context, View convertView, ViewGroup parent, int layoutId) { 
 if (convertView == null) { 
 return new ViewHolder(context,convertView,parent,layoutId); 
 }else { 
 return (ViewHolder) convertView.getTag(); 
 } 
 } 
 //返回一個(gè)View的子類(lèi)對(duì)象,因?yàn)椴淮_定用戶布局有什么組件,相當(dāng)于findViewById 
 //這里返回一個(gè)泛型,也可以返回一個(gè)View或Object 
 public <T extends View>T getView(int resId) { 
 View view = mViews.get(resId); //從集合中取出這個(gè)組件 
 if (view == null) { //如果為空,說(shuō)明為第一屏 
 view = mConvertView.findViewById(resId); //從convertView中找 
 mViews.put(resId,view); 
 } 
 return (T) view; 
 } 
 
 public View getConvertView() { 
 return mConvertView; 
 } 
} 

調(diào)用代碼:

public class MyAdapter extends CommonAdapter<Bean> { 
 public MyAdapter(Context context, List<Bean> data, int layoutId) { 
 super(context, data, layoutId); 
 } 
 @Override 
 public void setDatas(ViewHolder holder, Object object) { 
 Bean bean = (Bean) object; 
 ((TextView)holder.getView(R.id.title_Tv)).setText(bean.getTitle()); 
 ((TextView)holder.getView(R.id.desc_Tv)).setText(bean.getDesc()); 
 ((TextView)holder.getView(R.id.time_Tv)).setText(bean.getTime()); 
 ((TextView)holder.getView(R.id.phone_Tv)).setText(bean.getPhone()); 
 } 
} 
 List<Bean> data=new ArrayList<>(); 
 Bean bean=new Bean("標(biāo)題1", "內(nèi)容1", "時(shí)間1", "18300000000"); 
 Bean bean2=new Bean("標(biāo)題2", "內(nèi)容2", "時(shí)間2", "18300000000"); 
 data.add(bean); 
 data.add(bean2); 
 listView.setAdapter(new MyAdapter(context, data, R.layout.listview_item)); 

注釋寫(xiě)的很清楚了,就不多說(shuō)了。

自定義組合控,布局模塊化

正常的項(xiàng)目開(kāi)發(fā)中肯定有很多布局冗余例如下面圖紅框中的設(shè)置和導(dǎo)航。

很多人會(huì)把這些布局文件一遍又一遍的復(fù)制,只修改其中的ID、字符串等,其他部分幾乎一模一樣,造成布局文件代碼特別多。

最要命的不是這個(gè),而且把所有的邏輯寫(xiě)在Activity\Fragment里,造成Activity\Fragment特別的龐大,真正實(shí)現(xiàn)一坨X代碼。

我覺(jué)得應(yīng)該把公用的布局單獨(dú)抽取出來(lái)到一個(gè)xml里,再用一個(gè)GroupView去處理這些邏輯和業(yè)務(wù),減少activity\Fragment的負(fù)擔(dān)。

代碼就不貼了,自己去源碼demo里查看ParamSwitchView,這個(gè)View是圖1的一個(gè)Item,封裝了布局和所需要的遙控按鍵左右切換數(shù)據(jù)的邏輯。

面向接口編程

面向接口編程的意思是指在面向?qū)ο蟮南到y(tǒng)中所有的類(lèi)或者模塊之間的交互是由接口完成的。

父類(lèi)的引用指向子類(lèi)對(duì)象,指向不同的子類(lèi)對(duì)象,產(chǎn)生不同的行為:

父 a =new 子A;

有很多童靴在項(xiàng)目開(kāi)發(fā)中經(jīng)常更變業(yè)務(wù),例如:定制化系統(tǒng)應(yīng)用,底層的接口在不同型號(hào)的TV\手機(jī)上都有可能不一樣。
這時(shí)候把這些底層接口單獨(dú)封裝在一個(gè)類(lèi)進(jìn)行管理,在平臺(tái)發(fā)生改變的時(shí)候只需要改變實(shí)現(xiàn)。

定義接口類(lèi)統(tǒng)一化管理方法

public interface IManager { 
 
 void setBackLight(int value); 
 void setPictureMode(int mode); 
 
} 

實(shí)現(xiàn)類(lèi) 1

public class HuaWeiManager implements IManager { 
 
 @Override 
 public void setBackLight(int value) { 
 <strong>HuaWei</strong>.savaBackLight(value); 
 } 
 
 @Override 
 public void setPictureMode(int mode) { 
 <strong>HuaWei</strong>.setPictureMode(mode); 
 } 
 
} 

假如現(xiàn)在業(yè)務(wù)需求是華為的定制系統(tǒng),只需要調(diào)用華為的子類(lèi)

IManager iManager=new HuaWeiManager(); 
iManager.setBackLight(100); 

如果業(yè)務(wù)需求轉(zhuǎn)變成小米,那么只需要?jiǎng)?chuàng)建一個(gè)類(lèi)進(jìn)行實(shí)現(xiàn)

實(shí)現(xiàn)類(lèi) 2

public class XiaoMiManager implements IManager { 
 
 @Override 
 public void setBackLight(int value) { 
 XiaoMi.savaBackLight(value); 
 } 
 
 @Override 
 public void setPictureMode(int mode) { 
 XiaoMi.setPictureMode(mode); 
 } 
 
} 

調(diào)用代碼里只需要把HuaWeiManager改成XiaoMiManager就能適配其他機(jī)型了。

//IManager iManager=new HuaWeiManager(); 
IManager iManager=new XiaoMiManager(); 
iManager.setBackLight(100); 

在這里只是灌輸一個(gè)編碼思維,實(shí)際開(kāi)發(fā)中突發(fā)情況比較多,并不一定全部適用。

在編碼之前一定要花一點(diǎn)點(diǎn)時(shí)間簡(jiǎn)單構(gòu)思和組織一下代碼,不要想到什么寫(xiě)什么。

注重工具類(lèi)的封裝

我們正常的開(kāi)發(fā)中經(jīng)常用到很多不需要在邏輯層編寫(xiě)的方法,我們就可以單獨(dú)的把他抽取出來(lái)放在單獨(dú)的類(lèi)里面去單獨(dú)管理。

例如:Toast 、SharePreference、獲取時(shí)間、系統(tǒng)版本、網(wǎng)絡(luò)、MD5等等。。。。

這些東西都可以單獨(dú)的封裝和管理,減少邏輯層的代碼,并且也可以讓其他邏輯層調(diào)用。

壞習(xí)慣

有些人喜歡把定義個(gè)Tools這樣的工具類(lèi),里面存放著所有的工具方法。

1. 網(wǎng)絡(luò)、Toast、狀態(tài)、時(shí)間等等全部都用一個(gè)類(lèi)去管理,這樣造成的后果就是后期不方便維護(hù)和不利于更新,代碼看起來(lái)雜亂無(wú)章。

2. 把一些公共的方法直接在邏輯層構(gòu)建,其他地方需要就直接復(fù)制一份過(guò)去。

或者有其他相同的比較類(lèi)似的方法沒(méi)有進(jìn)行封裝,在其他地方直接復(fù)制過(guò)去只修改其他一行的代碼。

好習(xí)慣

1. 把這些tools單獨(dú)創(chuàng)建各種各樣的tools去存放這些方法,Toast只存Toast相關(guān)的,網(wǎng)絡(luò)只存網(wǎng)絡(luò)相關(guān)的,避免交雜在一起。也符合設(shè)計(jì)原則之一的:?jiǎn)我辉瓌t。

2. 類(lèi)似的方法獨(dú)立抽取出來(lái),用傳參flag標(biāo)記去區(qū)分應(yīng)用場(chǎng)景。

源碼里收藏了一些常用的工具類(lèi)分享給大家。

MVP分層架構(gòu)

去年寫(xiě)了一篇關(guān)于它的文章,大家可以看看。能夠讓代碼變得異常的清晰。

http://www.dbjr.com.cn/article/98422.htm

改善代碼的方式很多很多,一下子想不完,后面想到了什么再繼續(xù)更新分享。

相關(guān)文章

  • Android自定義加載圈的方法

    Android自定義加載圈的方法

    這篇文章主要為大家詳細(xì)介紹了Android自定義加載圈的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Android使用http協(xié)議與服務(wù)器通信的實(shí)例

    Android使用http協(xié)議與服務(wù)器通信的實(shí)例

    本篇文章主要介紹了Android使用http協(xié)議與服務(wù)器通信,Android與服務(wù)器通信通常采用HTTP通信方式和Socket通信方式,而HTTP通信方式又分get和post兩種方式。感興趣的小伙伴們可以參考一下。
    2016-12-12
  • Android手機(jī)衛(wèi)士之確認(rèn)密碼對(duì)話框

    Android手機(jī)衛(wèi)士之確認(rèn)密碼對(duì)話框

    這篇文章主要為大家詳細(xì)介紹了Android手機(jī)衛(wèi)士之確認(rèn)密碼對(duì)話框,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 如何利用adb卸載手機(jī)預(yù)裝軟件(系統(tǒng)軟件)

    如何利用adb卸載手機(jī)預(yù)裝軟件(系統(tǒng)軟件)

    對(duì)于Android手機(jī)通常有很多不必要的預(yù)置軟件,但是又無(wú)法卸載,占用桌面有很難受,所以本次使用adb工具來(lái)實(shí)現(xiàn)從電腦命令來(lái)卸載或停用軟件,下面這篇文章主要給大家介紹了關(guān)于如何利用adb卸載手機(jī)預(yù)裝軟件(系統(tǒng)軟件)的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Android ListView自定義Adapter實(shí)現(xiàn)仿QQ界面

    Android ListView自定義Adapter實(shí)現(xiàn)仿QQ界面

    這篇文章主要為大家詳細(xì)介紹了ListView自定義Adapter實(shí)現(xiàn)仿QQ界面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 如何從UA分辨出Android設(shè)備類(lèi)型

    如何從UA分辨出Android設(shè)備類(lèi)型

    本文主要介紹如何從UA分辨出Android設(shè)備類(lèi)型,這里整理了相關(guān)資料,來(lái)講解分辨Android設(shè)備類(lèi)型,有興趣的小伙伴可以參考下
    2016-08-08
  • Android為T(mén)iny4412設(shè)備驅(qū)動(dòng)在proc目錄下添加一個(gè)可讀版本信息的文件

    Android為T(mén)iny4412設(shè)備驅(qū)動(dòng)在proc目錄下添加一個(gè)可讀版本信息的文件

    今天小編就為大家分享一篇關(guān)于Android為T(mén)iny4412設(shè)備驅(qū)動(dòng)在proc目錄下添加一個(gè)可讀版本信息的文件,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • Android多種支付方式的實(shí)現(xiàn)示例

    Android多種支付方式的實(shí)現(xiàn)示例

    App的支付流程,添加多種支付方式,不同的支付方式,對(duì)應(yīng)的操作不一樣,有的會(huì)跳轉(zhuǎn)到一個(gè)新的webview,有的會(huì)調(diào)用系統(tǒng)瀏覽器,有的會(huì)進(jìn)去一個(gè)新的表單頁(yè)面,等等,本文就給大家詳細(xì)介紹一下Android 多種支付方式的優(yōu)雅實(shí)現(xiàn),需要的朋友可以參考下
    2023-09-09
  • Android事件分發(fā)機(jī)制示例分析

    Android事件分發(fā)機(jī)制示例分析

    在說(shuō)事件分發(fā)之前,我們先想一個(gè)問(wèn)題,在APP中我們點(diǎn)擊一個(gè)View的時(shí)候,事件是如何傳遞到這個(gè)View的呢?其實(shí)這就是我理解的事件分發(fā)機(jī)制。即當(dāng)手指點(diǎn)擊屏幕時(shí),事件傳遞到具體View的過(guò)程
    2022-08-08
  • Android串口通信封裝之OkUSB的示例代碼

    Android串口通信封裝之OkUSB的示例代碼

    本篇文章主要介紹了Android串口通信封裝之OkUSB的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10

最新評(píng)論