1

«С недавним выпуском Android библиотеки поддержки, редакция 24 разработчиков Google запеченные в библиотеке v4 новый вспомогательный класс для асинхронной инфляции макетов»v24 AsyncLayoutInflater раздувает на Ui нить

Это мой код:

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), чтобы увидеть на экране, блокируя поток пользовательского интерфейса!

Я сделал вид еще более тяжелым, чтобы быть уверенным, что отставание, которое я вижу, намного больше, чем 0,04.

+1

Инфляция - всего лишь один шаг на пути к просмотру изображения - как долго ваш взгляд измеряется и компоновка? – ianhanniballake

+0

~ 30 мс для измерения и 2,5 мс для компоновки (при получении времени для узла вида в представлении иерархии). –

ответ

1

Это может произойти из-за нескольких причин,

Для макета накачиваются асинхронно он должен иметь родителя которого generateLayoutParams (AttributeSet) потокобезопасно и все мнения строится в рамках инфляции не должны создавать никаких обработчиков или иначе вызывать myLooper(). Если макет, который пытается быть завышенным, не может быть сконструирован асинхронно по какой-либо причине, AsyncLayoutInflater автоматически вернется к раздуванию в потоке пользовательского интерфейса.

Кроме того, AsyncLayoutInflater не может использоваться для раздувания макетов, содержащих фрагменты. Вы можете узнать больше в docs

Смежные вопросы