【问题标题】:Android java Loading fragments laglessAndroid java加载片段无延迟
【发布时间】:2014-07-02 19:30:24
【问题描述】:

如果用户在菜单中导航,我会使用片段来更改用户界面。我的问题是,每次一个片段被另一个片段替换时,应用程序都会冻结一秒钟,因为它正在主线程上处理。 我已经阅读了有关使用线程在后台处理事物的信息,但是如果一个片段被另一个片段替换,您就不能这样做,因为它必须在主线程中加载。

那么,如果用户通过菜单导航,有没有办法在后台加载片段以防止滞后?

希望你们理解我,我已经尽力了。 盖革金

编辑:对于任何遇到同样问题的人:Mo Adel 的建议和此链接帮助我解决了问题Optimizing drawer and activity launching speed

【问题讨论】:

    标签: java android multithreading android-fragments load


    【解决方案1】:

    如果您从幻灯片菜单或选项卡中更改它 你可以在你的活动中使用这个方法来做到这一点

    public void switchContent(final Fragment fragment) {
        mContent = fragment;
        getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.content_frame, fragment)
        .commit();
        Handler h = new Handler();
        h.postDelayed(new Runnable() {
            public void run() {
                sm.showContent();
            }
        }, 50);
    }
    

    并将其添加到 menu_fragment 或其他用于更改片段的片段

    我的是一个 ListFragment,所以我做什么

    @Override
    public void onListItemClick(ListView lv, View v, int pos, long id) {
         ma.setSelecteIndex(pos , v);
         ((Menu_Adapter)lv.getAdapter()).notifyDataSetChanged();
         Fragment newContent;
         if(pos==0){
            newContent = new HomeFragment();
         }else if(pos==1){
            newContent = StoresFragment.NewInstance(pos);
         }else{
            newContent = DinningFragment.NewInstance(pos);
         }
        if (newContent != null)
            switchFragment(newContent);
    }
    
    // the meat of switching the above fragment
    private void switchFragment(Fragment fragment) {
        if (getActivity() == null)
            return;
    
        if (getActivity() instanceof CustomAnimation) {
            CustomAnimation ra = (CustomAnimation) getActivity();
            ra.switchContent(fragment);
        }
    }
    

    【讨论】:

    • 我正在使用抽屉式菜单。你能更详细地解释一下这个函数是如何通过这种方式加载来防止延迟的吗?感谢您的帮助!
    • 基本上所有工作都将在 50 gab 中完成,然后再显示在屏幕上。因此关闭抽屉菜单或单击抽屉中的项目的任何动画都不会滞后。它会在 50 毫秒 gab 后将其附加到屏幕之前执行 oncreate 方法。
    • 啊,好吧,你能不能最后展示一下 showContent() 做了什么,或者你只是在改变你加载的片段的内容吗?你帮了大忙!
    • 在我的例子中,show content 只是关闭了 SlideMenu 并开始初始化新片段中的视图...请用绿色勾号标记答案,如果你觉得它有帮助,请点赞,所以它会很有用为他人。
    【解决方案2】:

    确保onCreate()/onCreateView()(甚至onDestroy()/onPause()/onResume())的片段生命周期代码没有对其进行任何繁重的工作。您始终可以使用 ADT 方法分析工具来查看在片段替换期间导致 UI 线程变慢的原因。

    【讨论】:

    • 您可以从列表中排除 onResume,因为此时活动/片段已经可见或前景。
    • @waqaslam 但是,在 onCreate() 调用之后,片段 onResume() 仍然至少被调用一次。
    • onResume 总是在片段出现在前台时被调用,但这是一个不同的争论。我的意思是,onResume 命中你的片段的那一刻将处于可见状态。
    • onResume() 将在片段处于活动状态之前被调用:developer.android.com/guide/components/fragments.html 我关心的是把非 UI 的基本工作从 UI 线程中移出,所以在整体意义上,UI 线程的感知性能可以改进,但由于 onResume() 保证在 UI 线程上被 Android 调用,它内部不应该有任何繁重的工作。
    • 这是错误的“onResume() 将在片段激活之前被调用”。它的 onResume 确认片段处于活动/可见/前景状态 - 因此之前没有调用它,实际上它本身确认片段现在可见。只需在片段的 onResume 中调用Thread.sleep,您就会明白我的意思。除此之外,我同意我们永远不应该将繁重的工作负载放在任何片段的覆盖方法中,除非我们将它派生到另一个线程。
    猜你喜欢
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多