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
코드 를 개선 하 는 방식 이 많 습 니 다.한꺼번에 생각 이 나 지 않 습 니 다.나중에 생각 나 는 것 이 있 으 면 계속 업데이트 하고 공유 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.