v24 AsyncLayoutInflater在ui线程上膨胀

时间:2016-07-05 18:08:59

标签: android asynchronous layout-inflater ui-thread support-v4

"随着最近发布的Android支持库,修订版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 个答案:

答案 0 :(得分:1)

可能因为几个原因而发生,

  

对于要异步膨胀的布局,它需要有一个父类,其generateLayoutParams(AttributeSet)是线程安全的,并且构造为通胀的一部分的所有视图都不能创建任何处理程序或以其他方式调用myLooper()。如果由于某种原因无法异步构造试图膨胀的布局,AsyncLayoutInflater将自动回退到UI线程上的膨胀。

此外,AsyncLayoutInflater不能用于扩充包含片段的布局。您可以在docs

中了解详情