Android 코드 품질 관리 분석

템 플 릿 방법-기본 패키지
Activity 와 Fragment 는 Android 에서 가장 많이 사용 되 는 구성 요소 일 것 입 니 다.그 에 게 간단 한 패 키 징 을 하 는 것 은 코드 의 간결 성 을 향상 시 키 는 데 도 큰 도움 이 됩 니 다.
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;
	}
	
	/**
	 *     
	 */
	public abstract void init();
	/**
	 *        
	 */
	public abstract void findViews();
	/**
	 *        
	 */
	public abstract void initData();
	/**
	 *          
	 */
	public abstract void setListener();
	
	/**
	 *       
	 */
	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();

}
코드 가 비교적 간단 하고 템 플 릿 디자인 모델 을 사 용 했 습 니 다.한 가지 방법 은 한 가지 일 만 하고 초기 화 된 것 은 초기 화 작업 만 하고 감청 을 설정 한 것 은 감청 만 설정 합 니 다.몇 개의 Activity\Fragment 든 인 코딩 스타일 을 잘 통일 시 켜 더욱 뚜렷 하고 어 지 럽 지 않 게 보인다.
Fragment 단순 관리
다음은 표준 생 성 및 관리 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(); 
 } 
} 
매번 Fragment 를 만 들 때마다 이 방법 을 복사 해 야 합 니 다.코드 가 지루 하고 유지 와 업데이트 에 불리 합 니 다.
아래 에 포장 해 주세요.

public class FragmentFactory { 
 
 private FragmentActivity mContext; 
 private static FragmentFactory factory = new FragmentFactory(); 
 //        Fragment   
 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); 
 } 
} 
호출 코드:

FragmentFactory mFragmentFactory = FragmentFactory.getInstance().init(this, R.id.fl_content); 
mFragmentFactory.showFragment(MyFragment1.class); 
mFragmentFactory.showFragment(MyFragment2.class); 
위의 포장 은 범 형,공장,사례 등 지식 을 사용 했다.Activity 에서 대상 을 한 번 초기 화하 면 한 줄 의 코드 로 Fragment 를 관리 할 수 있 습 니 다.어떤 페이지 를 표시 하고 싶 으 면 해당 하 는 Fragment 의 class 로 전 송 됩 니 다.
단순 통용 어댑터
ListView 는 Android 에서 가장 자주 사용 하 는 구성 요소 입 니 다.Litsview 를 최적화 하 는 것 은 빠 질 수 없 는 작업 입 니 다.
Listview 로 가장 고 통 스 러 운 것 은 BaseAdapter 를 쓰 는 getView()방법 입 니 다.한 번 또 한 번 쓰 는 것 입 니 다.대부분의 코드 는 중복 되 고 불필요 하지만 쓸 수 밖 에 없습니다.다음은 불필요 한 코드 를 추출 하여 봉인 합 니 다.

public abstract class CommonAdapter<T> extends BaseAdapter { 
 //       ,List       ,          Bean 
 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(); 
 } 
 
 /** 
 *    item         
 * @param holder ViewHolder 
 * @param object             
 */ 
 public abstract void setDatas(ViewHolder holder, Object object); 
} 

public class ViewHolder { 
 private View mConvertView; 
 //           ,       
 private HashMap<Integer,View> mViews = new HashMap<>(); 
 //ViewHolder    ,   convertView         
 public ViewHolder(Context context,View convertView, ViewGroup parent, int layouId) { 
 convertView = LayoutInflater.from(context).inflate(layouId,parent,false); 
 convertView.setTag(this); //  setTag() 
 mConvertView = convertView; 
 } 
 //    ViewHolder   
 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(); 
 } 
 } 
 //    View     ,              ,   findViewById 
 //        ,       View Object 
 public <T extends View>T getView(int resId) { 
 View view = mViews.get(resId); //           
 if (view == null) { //    ,       
 view = mConvertView.findViewById(resId); // convertView   
 mViews.put(resId,view); 
 } 
 return (T) view; 
 } 
 
 public View getConvertView() { 
 return mConvertView; 
 } 
} 
호출 코드:

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("  1", "  1", "  1", "18300000000"); 
 Bean bean2=new Bean("  2", "  2", "  2", "18300000000"); 
 data.add(bean); 
 data.add(bean2); 
 listView.setAdapter(new MyAdapter(context, data, R.layout.listview_item)); 
주석 을 분명하게 썼 으 니 더 이상 말 하지 않 겠 다.
사용자 정의 조합 제어,레이아웃 모듈 화
정상 적 인 프로젝트 개발 에는 아래 의 빨간색 상자 의 설정 과 네 비게 이 션 등 구조 가 많 을 것 이다.

많은 사람들 이 이 레이아웃 파일 들 을 한 번 또 한 번 복사 하고 그 중의 ID,문자열 등 만 수정 하 며 다른 부분 은 거의 똑 같 아서 레이아웃 파일 코드 가 특히 많다.
가장 중요 한 것 은 이것 이 아니 라 모든 논 리 를 Activity\Fragment 에 써 서 Activity\\Fragment 가 매우 크 고 X 코드 를 실현 하 는 것 입 니 다.
공용 레이아웃 을 xml 에 따로 추출 하고 GroupView 로 이러한 논리 와 업 무 를 처리 하여 activity\Fragment 의 부담 을 줄 여야 한다 고 생각 합 니 다.
코드 는 붙 이지 않 습 니 다.원본 데모 에 가서 ParamSwitchView 를 보 세 요.이 View 는 그림 1 의 Item 입 니 다.레이아웃 과 필요 한 리모콘 버튼 을 밀봉 하여 데 이 터 를 좌우 로 전환 하 는 논리 입 니 다.
인터페이스 프로 그래 밍
인터페이스 프로 그래 밍 이란 대상 을 대상 으로 하 는 시스템 에서 모든 클래스 나 모듈 간 의 상호작용 은 인터페이스 에서 이 루어 진 다 는 뜻 이다.
부모 클래스 의 인용 은 하위 클래스 대상 을 가리 키 고 서로 다른 하위 클래스 대상 을 가리 키 며 서로 다른 행동 을 합 니 다.
부모 a=new 자식 A;
많은 어린이 부츠 들 이 프로젝트 개발 에서 자주 업 무 를 바꾼다.예 를 들 어 맞 춤 형 시스템 응용,바 텀 인 터 페 이 스 는 서로 다른 모델 의 TV\핸드폰 에서 다 를 수 있다.
이 럴 때 이런 바 텀 인 터 페 이 스 를 한 가지 유형 에 따로 밀봉 하여 관리 하고 플랫폼 이 바 뀌 었 을 때 바 꾸 기만 하면 된다.
인터페이스 클래스 통일 화 관리 방법 정의

public interface IManager { 
 
 void setBackLight(int value); 
 void setPictureMode(int mode); 
 
} 
실현 클래스 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); 
 } 
 
} 
만약 에 현재 업무 수요 가 화 웨 이의 맞 춤 형 시스템 이 라면 화 웨 이의 하위 클래스 만 호출 해 야 한다.

IManager iManager=new HuaWeiManager(); 
iManager.setBackLight(100); 
업무 수요 가 샤 오미 로 바 뀌 면 하나의 종 류 를 만들어 실현 해 야 한다.
실현 클래스 2

public class XiaoMiManager implements IManager { 
 
 @Override 
 public void setBackLight(int value) { 
 XiaoMi.savaBackLight(value); 
 } 
 
 @Override 
 public void setPictureMode(int mode) { 
 XiaoMi.setPictureMode(mode); 
 } 
 
} 
호출 코드 에 서 는 HuaWeiManager 를 XiaoMiManager 로 바 꾸 기만 하면 다른 기종 에 맞 출 수 있 습 니 다.

//IManager iManager=new HuaWeiManager(); 
IManager iManager=new XiaoMiManager(); 
iManager.setBackLight(100); 
여기 서 인 코딩 사 고 를 주입 할 뿐 실제 개발 에서 돌발 상황 이 비교적 많 기 때문에 반드시 모두 적용 되 는 것 은 아니다.
인 코딩 하기 전에 코드 를 간단하게 구상 하고 조직 하 는 데 시간 이 좀 걸 릴 것 이 며,무엇 을 쓰 는 지 생각 하지 마 세 요.
공구 류 의 포장 을 중시 하 다.
우리 의 정상 적 인 개발 에 서 는 논리 적 으로 작성 하지 않 아 도 되 는 방법 이 많이 사용 되 고 있 습 니 다.우 리 는 그 를 단독으로 추출 하여 단독 클래스 에 넣 어 단독으로 관리 할 수 있 습 니 다.
예 를 들 어 Toast,SharePreference,획득 시간,시스템 버 전,네트워크,MD5 등...
이 물건 들 은 모두 단독 적 으로 포장 하고 관리 할 수 있 으 며 논리 층 의 코드 를 줄 일 수 있 으 며 다른 논리 층 을 호출 할 수도 있다.
나 쁜 습관
어떤 사람들 은 Tools 와 같은 도구 류 를 정의 하 는 것 을 좋아 하 는데,그 안에 모든 도구 방법 이 저장 되 어 있다.
1.네트워크,Toast,상태,시간 등 을 모두 하나의 유형 으로 관리 하 는데 이런 결 과 는 후기 에 유지 하기 어렵 고 업데이트 에 불리 하 며 코드 가 난잡 해 보 입 니 다.
2.일부 공공 적 인 방법 을 논리 층 에 직접 구축 하고 다른 곳 에서 필요 하면 과 거 를 직접 복사 합 니 다.
또는 다른 비슷 한 방법 으로 패 키 징 을 하지 않 고 다른 곳 에서 과거 에 다른 줄 만 수정 한 코드 를 직접 복사 합 니 다.
좋 은 습관
1.이 tools 들 을 따로 만들어 서 이런 방법 을 저장 합 니 다.Toast 는 Toast 와 관련 된 것 만 저장 하고 네트워크 는 네트워크 와 관련 된 것 만 저장 하 며 한데 뒤 섞 이지 않도록 합 니 다.디자인 원칙 중 하나 인 단일 원칙 에 도 부합된다.
2.유사 한 방법 으로 독립 적 으로 추출 하여 전 삼 flag 표기 로 응용 장면 을 구분한다.
원본 코드 에는 자주 사용 하 는 도구 류 를 소장 하여 모두 에 게 공유 합 니 다.
MVP 계층 구조
작년 에 그것 에 관 한 글 을 한 편 썼 으 니 모두 가 볼 수 있다.코드 를 이상 하 게 선명 하 게 만 들 수 있 습 니 다.
https://www.jb51.net/article/98422.htm
코드 를 개선 하 는 방식 이 많 습 니 다.한꺼번에 생각 이 나 지 않 습 니 다.나중에 생각 나 는 것 이 있 으 면 계속 업데이트 하고 공유 합 니 다.

좋은 웹페이지 즐겨찾기