Android应用程序,活动启动滞后于viewpager

罗舒格

因此,在我的主要活动中,我有一个viewpager4页的页面。开始活动时,我有一个异步任务,该任务会读取一个带有启动屏幕和的文件progressbar,但是完成后,我开始查看分页器活动,由于每个片段的大小,转换时会有明显的滞后时间。

我在主线程上所做的唯一工作是UI初始化。对其进行基准测试时,将按以下顺序进行:

MainActivity.onCreate 23ms
Fragment1.onCreateView 73ms
Fragment2.onCreateView 40ms
Fragment3.onCreateView 12ms
Fragment4.onCreateView 119ms

这些都在主线程上,因此加起来大约有300毫秒以上的延迟时间,足以破坏平滑的过渡动画。

这是启动过程中的方法分析输出

ddmshttp://i.imgur.com/LfmrOzE.png?1

我看不到自己的方法或类都不会占用大量时间,所有事情都由系统来实现,例如TextView<init>MessageQueue.next

长时间发布我的所有代码似乎是不必要的,所有工作都是UI设置,设置textviewsprogressbars我在所有片段上使用一个类来动态管理以下内容中的垂直列表scrollview

public class NestedListView extends LinearLayout implements View.OnClickListener {

    public static final int ID_NO_DIV = -1;

    private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);

    private OnViewListener mListener;
    private int mChildResId, mDivId;
    private boolean mListenForClick = true;

    public interface OnViewListener {
        public void onUpdateView(View view, int position, boolean initialCall);

        public void onViewClick(View view);
    }

    public NestedListView(Context context) {
        super(context);
    }

    public NestedListView(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
    }

    public void setNoClickListener() {
        mListenForClick = false;
    }


    public void createViews(int viewId, int divId, int count, OnViewListener listener) {
        mListener = listener;
        mChildResId = viewId;
        mDivId = divId;

        LayoutInflater inflater = LayoutInflater.from(getContext());

        for (int i = 0; i < count; ++i) {
            View view = createView(viewId, inflater);
            mListener.onUpdateView(view, i, true);
            addView(view);
        }

        setFooterDiv(INVISIBLE);
    }

    private View createView(int rid, LayoutInflater inflater) {
        View view = inflater.inflate(rid, this, false);
        view.setId(genViewId());
        if (mListenForClick)
            view.setOnClickListener(this);

        return view;
    }

    private static int genViewId() {
        for (;;) {
            final int result = sNextGeneratedId.get();
            // aapt-generated IDs have the high byte nonzero; clamp to the range under that.
            int newValue = result + 1;
            if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0.
            if (sNextGeneratedId.compareAndSet(result, newValue)) {
                return result;
            }
        }
    }

    private void setFooterDiv(int visibility) {
        int count = getChildCount();
        if (mDivId != ID_NO_DIV && count > 0)
            getChildAt(count - 1).findViewById(mDivId).setVisibility(visibility);
    }

    public void update() {
        update(getChildCount());
    }

    public void update(int size) {
        setFooterDiv(VISIBLE);

        // resize to size
        int childCount = getChildCount();
        if (childCount > size) {
            // shrink
            for (int i = childCount - 1; i >= size; --i)
                removeViewAt(i);
            childCount = size;
            setFooterDiv(INVISIBLE);
        }
        else if (childCount < size) {
            // grow
            LayoutInflater inflater = LayoutInflater.from(getContext());
            for (int i = childCount; i < size; ++i) {
                View view = createView(mChildResId, inflater);
                mListener.onUpdateView(view, i, true);
                addView(view);
            }
            setFooterDiv(INVISIBLE);
        }

        for (int i = 0; i < childCount; ++i)
            mListener.onUpdateView(getChildAt(i), i, false);
    }

    @Override
    public void onClick(View view) {
        mListener.onViewClick(view);
    }

这就像非滚动列表视图一样使用,与其他元素嵌套在滚动视图中。原因是我希望整个页面滚动而不是列表滚动。

在每个片段中,我称

nestedListView.createViews( 
    <item layout id>, 
    <id of child divider>, 
    <number of children to create>,
    callbackListener);

并在每个片段中callback.updateView初始化每个子视图。

我认为滞后是由于此类造成的,因为片段1和4具有此类的最长列表(花费了最长的时间),并且子视图包含更复杂的子视图。

无论如何,可以优化此类吗?我的印象是您无法在后台线程中增加视图?

我当时正在考虑findViewById在后台线程中进行引用,但是根据ddmsfindViewById调用,其占用时间少于%0.2。

那么,有什么建议可以缩短该活动的启动时间?

罗舒格

我已经找到了解决过渡滞后的方法,但是Zygoteinit在优化方面提出了一些好的观点,但似乎没有一个很好地起作用。

在我的主要活动中,我使用了ViewAnimator并在转换方法的开头调用了addView()和showNext()。

如果你打电话

addView(...);
mViewAnimator.post(new Runnable() {
    public void run() { mViewAnimator.showNext(); }
};

在消息队列中初始化片段之后,它将执行过渡,从而提供了一个很好的平滑过渡。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Android应用程序滞后于不同手机但处理器相同

来自分类Dev

Windows 8.1 Asus G711JW-滞后于最大化某些应用程序

来自分类Dev

从Android库模块在主应用程序中启动活动

来自分类Dev

Android应用程序无法启动活动componentinfo

来自分类Dev

Android应用程序空指针无法启动活动ComponentInfo

来自分类Dev

如何从Android中的活动启动应用程序?

来自分类Dev

Android - 应用程序无法启动活动组件信息

来自分类Dev

从应用程序启动特定活动

来自分类Dev

从应用程序启动表盘配置活动

来自分类Dev

检测应用程序内部启动的活动

来自分类Dev

启动相机活动,应用程序崩溃

来自分类Dev

Android Studio 启动错误的活动,但当清除应用程序的数据和缓存时,应用程序正常启动

来自分类Dev

Android-从搜索按钮启动活动-从长按选项中删除我的应用程序的活动

来自分类Dev

大量应用滞后于Xubuntu

来自分类Dev

大量应用滞后于Xubuntu

来自分类Dev

PhoneGap应用程序启动时如何启动Android活动?

来自分类Dev

启动外部活动后,Xamarin.Forms Android应用程序将重新启动

来自分类Dev

android 应用活动滞后

来自分类Dev

用于启动应用程序的活动不存在(无法在Android 5.1.1中打开计算器应用程序)

来自分类Dev

每次启动应用程序时启动活动

来自分类Dev

替换Android中的主要活动后无法启动应用程序

来自分类Dev

Android:了解应用程序启动时活动如何开始

来自分类Dev

Android-打算在我的应用程序之外启动活动

来自分类Dev

离开并返回我的应用程序时,android重新启动活动

来自分类Dev

从另一个活动(Android)启动社交媒体应用程序或浏览器

来自分类Dev

Android Studio:使用ImageButton启动新活动会使应用程序崩溃

来自分类Dev

如何从屏幕底部到顶部启动一个Android应用程序(非活动)?

来自分类Dev

如何从Android 30中的另一个应用程序启动活动

来自分类Dev

如果在Android中关闭了启动活动,如何使应用程序关闭

Related 相关文章

  1. 1

    Android应用程序滞后于不同手机但处理器相同

  2. 2

    Windows 8.1 Asus G711JW-滞后于最大化某些应用程序

  3. 3

    从Android库模块在主应用程序中启动活动

  4. 4

    Android应用程序无法启动活动componentinfo

  5. 5

    Android应用程序空指针无法启动活动ComponentInfo

  6. 6

    如何从Android中的活动启动应用程序?

  7. 7

    Android - 应用程序无法启动活动组件信息

  8. 8

    从应用程序启动特定活动

  9. 9

    从应用程序启动表盘配置活动

  10. 10

    检测应用程序内部启动的活动

  11. 11

    启动相机活动,应用程序崩溃

  12. 12

    Android Studio 启动错误的活动,但当清除应用程序的数据和缓存时,应用程序正常启动

  13. 13

    Android-从搜索按钮启动活动-从长按选项中删除我的应用程序的活动

  14. 14

    大量应用滞后于Xubuntu

  15. 15

    大量应用滞后于Xubuntu

  16. 16

    PhoneGap应用程序启动时如何启动Android活动?

  17. 17

    启动外部活动后,Xamarin.Forms Android应用程序将重新启动

  18. 18

    android 应用活动滞后

  19. 19

    用于启动应用程序的活动不存在(无法在Android 5.1.1中打开计算器应用程序)

  20. 20

    每次启动应用程序时启动活动

  21. 21

    替换Android中的主要活动后无法启动应用程序

  22. 22

    Android:了解应用程序启动时活动如何开始

  23. 23

    Android-打算在我的应用程序之外启动活动

  24. 24

    离开并返回我的应用程序时,android重新启动活动

  25. 25

    从另一个活动(Android)启动社交媒体应用程序或浏览器

  26. 26

    Android Studio:使用ImageButton启动新活动会使应用程序崩溃

  27. 27

    如何从屏幕底部到顶部启动一个Android应用程序(非活动)?

  28. 28

    如何从Android 30中的另一个应用程序启动活动

  29. 29

    如果在Android中关闭了启动活动,如何使应用程序关闭

热门标签

归档