마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 개발 중 효율적인 방법을 잘 모르겠습니다...(초보)

0 추천

안녕하세요. 안드로이드 초보 개발자입니다. 

코딩을 하면서 질문이 생겨서 글을 남깁니다.

 

1. Button같은 것들을 전역으로 만드는 것과 사용할때마다 findViewById를 이용하는 것 중 어떤 것이 더 좋은가요?(효율적으로)

 

2. Webservice로 서비스 호출할 때 반드시 Asynctask를 이용해야하나요? (기존에 이용하지 않길래 그 상태에서 좀 바꿨더니 어떤 에러가 뜨길래.. 검색해보니 AsyncTask를 이용하면 해결이 된다고 하더라구요..) AsyncTask말고 좀 더 간결하게 접근할 방법이 있을까요? (모든 클래스 내에 또 클래스를 만들려 하니 좋은지를 잘 모르겠습니다... (제가 바꾼 소스에서는 AlertDialog 내에서 AsyncTask를 이용하였습니다.)

 

2번에 관한 현 소스입니다.

private void AlertDialogList(String alertNm, final String alertId, CharSequence charDept) {
		AlertDialog.Builder builder = new AlertDialog.Builder(this, AlertDialog.THEME_HOLO_DARK);
		builder.setTitle(alertNm).setCancelable(true).setAdapter(setAdapter(alertId, charDept),
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int position) {
						try {
							topBar_dialog_flg = true;
							if(alertId.equals("firstLab")){
								String exrm_nm = ((JSONObject)labList.get(position)).getString("EXRM_NM");
								((Button)findViewById(R.id.btnFirstLab)).setText(exrm_nm);
								firstTabCode = ((JSONObject)labList.get(position)).getString("EXRM_TP_CD");
								secondTabCode="";
								((Button)findViewById(R.id.btnSecondLab)).setText("검사실 전체");
							}else if(alertId.equals("secondLab")){
								String exrm_nm = ((JSONObject)labList.get(position)).getString("EXRM_NM");
								((Button)findViewById(R.id.btnSecondLab)).setText(exrm_nm);
								secondTabCode = ((JSONObject)labList.get(position)).getString("EXRM_TP_CD");
							}
						} catch (Exception e) {
							showToast(e.getMessage());
						}
					}
				});
}

private AlertdialogAdapter setAdapter(String alertId, CharSequence charDept) {
		AsyncTaskAlertDialog asyncTaskAlertDialog = new AsyncTaskAlertDialog();
		try {
			labList = new JSONArray(asyncTaskAlertDialog.execute(alertId).get().toString());
		} catch (Exception e) {
			showToast(e.getMessage());
		}
		return new AlertdialogAdapter(this, R.layout.alertdialog_list_layout, labList, "EXRM_NM","EXRM_TP_CD");
	}
private class AsyncTaskAlertDialog extends AsyncTask<Object, Object, Object>{

		@Override
		protected Object doInBackground(Object... params) {
~~~~

                }
}

 

행인28 (480 포인트) 님이 2016년 6월 14일 질문

2개의 답변

0 추천
 
채택된 답변
1. findViewbyId같은경우 리소스를 엄청 잡아먹는 작업입니다. 최소한으로 불리우는 것이 좋습니다.

2. 작업시간이 길거나 얼마나 걸릴지 미지수인 작업은 메인쓰레드에서 처리 하지 못하도록 되어있습니다.

이유인 즉슨 얼마나 걸릴지도 모르는 작업을 위해 UI등 유저와 직접 연결된 UX에 사용될 리소스를 제공 할 이유가 없기 때문입니다.

즉 더나은 사용자 경험을 위한 것이니 따라야 겠지요~~!
ThisPlus (46,920 포인트) 님이 2016년 6월 14일 답변
행인28님이 2016년 6월 14일 채택됨
오오오 감사합니다!!!! 아직 신입이라... 어떤게 옳을지 모르고 안드로이드를 담당하시는 분도 안계셔서... 그렇게 따지면 차라리 findView를 한번 하고 전역으로 갖고 있는게 더 효율적이겠네요!! 감사합니다!!ㅎ
0 추천
전역변수와 멤버변수의 차이점은 알고 계신가요?

전역은 Global 즉 static이고 멤버는 클래스내부에서 한정되게 선언된 변수입니다.

버튼을 전역(Static)으로 선언할 이유가 없지요..

멤버변수로 선언해서 쓰시면 되요.

그리고 구글 샘플프로젝트들 보면 아래처럼 깔끔히 정리해서 코딩한답니다.
 

public class Test1{

private Button mButton1;

public void onCreate(...){

...

..

loadView();

 

}

private void loadView(){

mButton = (Button)findViewById(R.id.button1);

}

}

 

이렇게 쓰면 나중에 관리하기 편하실거에요.
갸아악 (21,260 포인트) 님이 2016년 6월 14일 답변
감사드립니다!!
근데 그렇게 할 경우 고민이 되는 문제점이 너무 여기저기서 많이 불러서 쓰니까 할때마다 findView를 하게되는(원래와 같은 질문이 되었네요..ㅎ) 문제점이 생겼습니다ㅠ 하지만 윗분이 말씀하신대로 findView가 엄청나게 잡아먹는다면 전역으로 빼는게 나을듯 하네요!!ㅎ
단어선택의 문제를 지적하셧는데 아마 두분은 같은 것을 다르게 부르시는 듯하군요.
갸아악님이 말씀하신 맴버 변수가 맞는 용어 입니다.
그리고 예를 드신것은 초기화를 onCreate같은 곳에서 한번에 하지말고 따로 초기화 함수를 만들어서 맵버 변수를 초기화 하는 것이 코딩과 디버깅에 도움이 많이된다는 팁을 주시는 것으로 보입니다 ^^.
참고로 자바 코딩규칙 권고안에는 하나의 함수가 되도록이면 길지않게 작성하고 길어질 경우 서버 펑션으로 불리하라고 제안하고 있습니다.
...