상세 컨텐츠

본문 제목

안드로이드 MPAndroidChart 사이즈 작아지는 현상

안드로이드

by 삽질하는 개발자 2023. 1. 16. 10:46

본문

안드로이드 mp 차트를 사용하여 그래프를 표시하면 10번중 1번 정도? 그래프가 찌그러져서 표시되는 현상이 발생

width, height 는 고정값, match_parnet 상관 없이 동일한 현상이 발생.

 

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    mPresenter = new ProductDetailPresenter(this);

    mLoadingDlg = new LoadingDialog(mCtx);

    mBd.closeBtnIv.setOnClickListener(this);
    mBd.bottomBtnTv.setOnClickListener(this);
    mBd.investType1TabTv.setOnClickListener(this);
    mBd.investType2TabTv.setOnClickListener(this);
    mBd.investType3TabTv.setOnClickListener(this);
    mBd.investType4TabTv.setOnClickListener(this);

    ...
    
    getData(Collections.min(availableType));  //그래프를 및 화면을 표시하는 함수
}

 

해결방안으로는 postDelayed 딜레이로 딜레이를 주면 정상적으로 표시.

포스트 딜레이를 1, 10, 1000 상관없이 정상적으로 표시 되는데 정확한 원인에 대해서는 좀 더 확인이 필요.

 

new Handler().postDelayed(() -> getData(Collections.min(availableType)), 1);

----------------------------------------------------------------------------------------------------------------------

 

***  원인

 

기존 onViewCreated에서 그래프(view)를 그렸다.

그래프를 그리기 위한 기본 설정값들이 있는데, 그래프가 화면에 attach(화면에 View가 보여지는 시기)전에 이 설정값들이 적용되서 크기 관련 설정들을 무시하고 넘어간것이다.

 

postDelayed를 사용하면 화면에 그래프(View)의 attach여부를 확인한다.

View.post()는 attach되지 않으면 post된 모든 runnable들의 실행이 attach 될 때 까지 연기(postpone)된다.

postDelayed를 사용하면 화면에 attach 된 후 설정 값들이 적용되서 그래프가 정상적으로 표시 되기 때문이다.  

 

간단한 텍스트나 이미지 표시등은 상관없지만, 그래프나 무거운 뷰를 그릴 땐 postDelayed를 사용해서 attach를 체크하자

 

아래는 좋은 글이 있어 참고용으로 남겨 놓음.

----------------------------------------------------------------------------------------------------------------------

 

 

일단 안드로이드는 UI 관련 처리를 단일 thread 모델로 처리한다.

ui를 처리하는 thread 는 모든 ui를 담당 (ui thread 혹은 main thread라고 부른다.)

그외 worker thread들은 ui에 직접 접근 할 수 없다.

 

worker thread에서 ui 접근하려면 ui thread에 작업을 요청해야 하는데, worker thread 의 갯수를 알 수 없으므로 queueing방식이 적절하다.

ui thread는 기본적으로 MessageQueue를 포함하고 있는 Handler Thread이다.

 

안드로이드에서 ui thread에 접근할 수 있는 방법 3가지 예시 

 

1. Handler 와 Looper.getMainLooper()를 이용한 방법 

2. Activity.runOnUiThread를 이용한 방법 

3.View.post를 이용한 방법 

 

이 중에서 3번째 View.post를 살펴보자.

View.post()

겉보기에는 Handler와 별 차이가 없어보인다. 그래서 깊이 설명이 안되어있는 경우가 있는데 정말 중요한 차이가 하나 있다. 아래의 소스를 보자.

public boolean post(Runnable action) {
final AttachInfo attachInfo = mAttachInfo;
if (attachInfo != null) {
return attachInfo.mHandler.post(action);
}
 
// Postpone the runnable until we know on which thread it needs to run.
// Assume that the runnable will be successfully placed after attach.
getRunQueue().post(action);
return true;
}

Handler와 사용하는 인터페이스가 비슷하지만 가장 중요한 차이는 바로 attach가 됐는지 여부를 확인한다는 것이다. View가 attach, 즉 화면에 보여지는 시기에 맞춰서 실행하려면 View.post()를 사용해야한다.

다시 말하면 View.post()는 attach되지 않으면 post된 모든 runnable들의 실행이 attach 될 때 까지 연기(postpone)된다. 여기서 getRunQueue는 View에만 존재하는 pending된 Runnable들의 HandlerActionQueue이다.

이는 View와 관련한 미묘한 타이밍 이슈를 처리할 때, 유용하게 사용된다. View가 GONE되거나 detach된 경우 아무리 post를 호출해도 등록된 콜백들은 동작하지 않게된다. 이런 섬세한 처리부분은 Handler만 가지곤 불가능하다.

 

 

참고자료: https://blog.yatopark.net/category/computer/android-os/

관련글 더보기