1

에 팽창되어V24의 AsyncLayoutInflater는 UI 스레드

"안드로이드 지원 라이브러리의 최근 출시와 함께, 개정 24 구글 개발자가 V4 라이브러리로 레이아웃의 비동기 인플레이션에 대한 새로운 헬퍼 클래스를 구운"이것은 내 코드입니다 :

Timber.e("Timeinflationstarts"); 
    AsyncLayoutInflater asyncLayoutInflater=newAsyncLayoutInflater(this.getContext()); 
    asyncLayoutInflater.inflate(R.layout.async_calendar,mLinearLayout, 
      new AsyncLayoutInflater.OnInflateFinishedListener() { 
     @Override 
     public void onInflateFinished(View view, int resid, ViewGroup parent) { 

      parent.addView(view); 
      Timber.e("timeWhenInflated"); 
     } 
    }); 

이 출력이다

07-05 20:36:22.331 18250-18250/? E/PersonalFragment: Timeinflationstarts 

07-05 20:36:22.371 18250-18250/? E/PersonalFragment: timeWhenInflated 

문제 async_calendar.xml에서보기 많은 시간 (0.04s 후)에 걸리는 것을 볼 수 화면에서 UI 스레드를 차단합니다!

내가보기에 지연이 0.04 이상이라는 것을 확인하기 위해보기를 더 무겁게 만들었습니다.

+1

인플레이션은 뷰를 그릴 때의 한 걸음에 불과합니다. 측정 및 레이아웃에 얼마나 오래 걸릴까요? Measure의 경우 – ianhanniballake

+0

~ 30ms, 레이아웃의 경우 2.5ms (계층보기에서 뷰 노드의 시간을 얻을 때). –

답변

1
이 때문에 여러 가지 이유로 발생할 수

, 레이아웃은 비동기 적으로 팽창 될이 그 generateLayoutParams (속성 세트) 스레드 안전하고 모든 뷰는 인플레이션의 일환으로 건설되고 부모를 가질 필요가 들어

핸들러를 만들거나 myLooper()를 호출해서는 안됩니다. 팽창하려고하는 레이아웃을 어떤 이유로 든 비동기 적으로 생성 할 수없는 경우 AsyncLayoutInflater는 UI 스레드에서 자동으로 다시 팽창합니다.

또한 AsyncLayoutInflater는 조각이 포함 된 레이아웃을 확장하는 데 사용할 수 없습니다. 자세히 알아보기 docs