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

그리드뷰로 달력만들때 속도관련해서 질문드리겠습니다.

0 추천
현재 연습삼아 만들고있는 어플에 달력이 들어갑니다. 요일표시 7개와 날짜표시 42개로 이루어진 달력속 날마다 데이터를 입력하고 달력에 표시되도록 만들어놨는데 데이터가 그닥 많은건아닌데 로딩?속도가 너무오래걸립니다.

리스트뷰로 만들어논 목록을 눌러 달력을 볼수있는데 눌르고 약 2초가량멈춘후 화면이 뜨게됩니다.

이미지가 표시되는것도아닌데 이렇게 속도가느린이유를 도저히모르겠습니다.

고수님들 답변 부탁드립니다 ㅠㅠ.
kanoo (2,700 포인트) 님이 2017년 2월 9일 질문

1개의 답변

0 추천
 
채택된 답변
질문자님이 의심부분 코드를 올려주셔야 정확한 판단이 가능합니다.

내용 보면 대충 화면에 뷰가 많이 사용될거 같은데

findViewById 함수가 생각보다 오버헤드가 큽니다.

그리드뷰를 사용하셨다고 하셨는데 위의 이슈를 최소화 하시려면 뷰홀더패턴을 사용하셔야 하는데 그리 하셨는지 궁금하네요.

 

저는 정말 답답해서 모든라인다음줄에 로그를 찍어 걸리는 시간을 확인한적이 있습니다.

이렇게라도 해서 정확한 원인파악을 하시는것이 중요합니다.
Development Guy (69,670 포인트) 님이 2017년 2월 9일 답변
kanoo님이 2017년 2월 10일 채택됨
private Context mContext;
    private List<alba_calendar_data> grid;

    public alba_calendar_adapter(Context context, List<alba_calendar_data> data){
        this.mContext = context;
        this.grid = data;
    }
    @Override
    public int getCount() {
        return grid.size();
    }

    @Override
    public Object getItem(int position) {
        return grid.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView==null){
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.fragment_alba_info_caledar_grid,null);
            ViewHolder holder = new ViewHolder();
            holder.day_num = (TextView) convertView.findViewById(R.id.day_num);
            holder.today = (TextView) convertView.findViewById(R.id.today_line);

            holder.time = (TextView)convertView.findViewById(R.id.grid_time);
            holder.over = (TextView) convertView.findViewById(R.id.grid_over);
            holder.break_t = (TextView) convertView.findViewById(R.id.grid_break);
            holder.night = (TextView) convertView.findViewById(R.id.grid_night);
            holder.vaca = (TextView) convertView.findViewById(R.id.grid_vaca);
            holder.week_t = (TextView) convertView.findViewById(R.id.grid_week);
            holder.memo = (TextView) convertView.findViewById(R.id.grid_memo);
            convertView.setTag(holder);
        }
        alba_calendar_data data = grid.get(position);
        if(data!=null) {
            ViewHolder holder = (ViewHolder)convertView.getTag();
            convertView.setBackgroundResource(R.drawable.back);
            holder.today.setVisibility(View.INVISIBLE);
            holder.time.setVisibility(View.INVISIBLE);
            holder.over.setVisibility(View.INVISIBLE);
            holder.break_t.setVisibility(View.INVISIBLE);
            holder.night.setVisibility(View.INVISIBLE);
            holder.vaca.setVisibility(View.INVISIBLE);
            holder.week_t.setVisibility(View.INVISIBLE);
            holder.memo.setVisibility(View.INVISIBLE);
            if (position % 7 == 0) {
                holder.day_num.setTextColor(convertView.getResources().getColor(R.color.red));
            } else if (position % 7 == 6) {
                holder.day_num.setTextColor(convertView.getResources().getColor(R.color.blue));
            }
            if (data.getInMont() == 0) {
                holder.time.setText("");
                holder.day_num.setText(data.getWeek());
            } else if (data.getInMont() == 1 || data.getInMont() == 4) {
                convertView.setBackgroundResource(R.drawable.back1);
                holder.day_num.setTextColor(convertView.getResources().getColor(R.color.gray));
                holder.day_num.setText(data.getDay() + "");
            } else if (data.getInMont() == 2 || data.getInMont() == 3) {
                holder.day_num.setText(data.getDay() + "");
            }
            if (data.getInMont() == 3)
                holder.today.setVisibility(View.VISIBLE);
            if (data.getRun_time() > 0) {
                holder.time.setVisibility(View.VISIBLE);
                holder.time.setText(String.format("%02d:%02d", data.getRun_time() / 60, data.getRun_time() % 60)+"\n"+makeStringComma(data.getTot_money()) + "");
                try {
                    if (data.getMemo().length() != 0) holder.memo.setVisibility(View.VISIBLE);
                } catch (NullPointerException e) {
                }
                if (data.getBreak_time() > 0)
                    holder.break_t.setVisibility(View.VISIBLE);
                if (data.getNight_time() > 0)
                    holder.night.setVisibility(View.VISIBLE);
                if (data.getVaca() > 0)
                    holder.vaca.setVisibility(View.VISIBLE);
                if (data.getOver_time() > 0)
                    holder.over.setVisibility(View.VISIBLE);
                if (data.getWeek_time() > 0)
                    holder.week_t.setVisibility(View.VISIBLE);
            }
        }
        return convertView;
    }
    static class ViewHolder{
        TextView time,day_num,today,over,night,vaca,break_t,memo,week_t;
    }
    protected String makeStringComma(int str) {
        long value = str;
        DecimalFormat format = new DecimalFormat("###,###");
        return format.format(value);
    }
}

소스어떤식으로 올려야하지 모르겠어서 이렇게 올립니다 ㅠㅠ
말씀해주신데로 로그찍어서 해봤는데 어뎁터로 뿌려주는 구간이 이상하게도
다끝나고 프레그먼트 뷰 리턴할때 시작되고 뿌려주는작업이 끝나야 화면이 보이네요... 확실이 어뎁터뷰에서 시간을 많이잡아먹는듯한데 어떤식으로 줄여야할지 감이안옵니다 ㅠㅠ xml에서도 뷰나 레이아웃을 최소화했고 클레스파일에서도 뷰홀더 해놓았는데 뭐가문제인지모르겠습니다...
자답 입니다. 말씀하신데로 findViewById를 줄이니 속도가 많이개선되었습니다.
감사합니다!
...