바르고 뜨겁게
[안드로이드] AsyncTask 분리하기 , 서버통신 분리하기 본문
처리 후 onPostExecute가 호출되는 시점을 관리하기가 까다롭다. EX) 서버 통신 후 TextView에 setText를 하는 경우 사용자가 화면을 이동하여 setText를 못하는 경우 앱이 죽는다.
같은 메서드라도 화면마다 호출해야 되기 때문에 유지보수에 어려움이 있다. EX) A화면에서 login 처리, B화면에서 login 처리, C화면 ... 일경우 수정이 일어나면 일일히 모든 Activity java에서 수정을 해야한다.
따라서 브로드캐스트 리시버를 이용한 아래와 같은 방법으로 서버 통신 로직을 분리 할 수 있다.
1. 렌더링할 Activity java 에서 브로드캐스트 리시버를 생성한다.
// 브로드 캐스트 리시버 옵저버 (서버 통신 후 로직 처리)
private BroadcastReceiver broadCastReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
HashMap<String, String> result = (HashMap<String, String>) intent.getSerializableExtra("result");
String bcName = intent.getStringExtra("bcName");
Log.d(TAG, "브로드캐스트 수신 bcName: " + bcName);
if ("m_app_version".equals(bcName)) {
String rsp_code = result.get("RSP_CODE");
if ("100".equals(rsp_code)) {
// 화면 처리
} else {
CommonAlert.toastMsgLong(getText(R.string.error_msg_restart) + "(" + rsp_code + ")", mContext);
}
}
}
};
2. 렌더링할 Activity java 에서 리시버를 수신, 해제한다
protected void onCreate(Bundle savedInstanceState) {
// SERVER_COMMNUNICATION 이름으로 정의된 브로드캐스트를 수신
LocalBroadcastManager.getInstance(this).registerReceiver(broadCastReceiver, new IntentFilter("SERVER_COMMNUNICATION"));
}
protected void onDestroy() {
// 화면을 벗어나면 구독종료
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadCastReceiver);
super.onDestroy();
}
3. 서버통신을 공통으로 담당할 class
public class ServerCommunication {
private final static String SC_TAG = "ServerCommunication";
private static void broadCastSend(Context getContext, final String bcName, final HashMap resultMap) {
Intent intent = new Intent("SERVER_COMMNUNICATION");
intent.putExtra("result", resultMap);
intent.putExtra("bcName", bcName);
LocalBroadcastManager.getInstance(getContext).sendBroadcast(intent);
}
// ** 앱 버전 체크
public static void m_app_version(final Context getContext) {
final HashMap resultMap = new HashMap();
AsyncTask<Void, Void, Void> worker = new AsyncTask<Void, Void, Void>() {
String ACTION_METHOD = "- m_app_version() ";
protected void onPreExecute() {
Log.d(SC_TAG, ACTION_METHOD + "시작");
super.onPreExecute();
}
protected Void doInBackground(Void... params) {
// 통신로직 처리 ... 화면으로 전달할 데이터 SET
resultMap.put("RSP_CODE", rsp_code);
return null;
}
protected void onPostExecute(Void result) {
Log.d(SC_TAG, ACTION_METHOD + " onPostExecute RSP_CODE: " + rsp_code);
// 구독중인 화면으로 데이터 전송
broadCastSend(getContext, "m_app_version", resultMap);
}
};
worker.execute();
}
}
이렇게 처리를 하면 onPostExecute가 호출되는 시점에 화면이 이동되더라도 이미 브로드캐스트리시버의 구독을 취소했기 때문에
또한 별도의 class에서 모든 로직이 분리되어 관리되기 때문에 해당 class에서 하나의 로직만 수정해주면
'안드로이드' 카테고리의 다른 글
[안드로이드] 레트로핏2 를 사용해 서버 통신하기 (0) | 2019.04.12 |
---|---|
[안드로이드] 글라이드(Glide) 아웃오브메모리 방지, 메모리 최적화 (0) | 2019.04.05 |
안드로이드 스튜디오 자체 오류/에러 해결방법 (0) | 2019.03.27 |
[안드로이드] 리사이클러뷰(RecyclerView) 높이(Height) 동적 변경 (0) | 2019.02.08 |
[안드로이드] 키해시 얻는 방법 (debug keyhash, release keyhash, googlePlay keyhash) (5) | 2019.01.28 |