Fragmenttabhost 性能慢?

Posted

技术标签:

【中文标题】Fragmenttabhost 性能慢?【英文标题】:Fragmenttabhost performance is slow? 【发布时间】:2013-03-08 04:14:56 【问题描述】:

我已将v4 support lib 用于FragmentTabHost

要求是,当我将标签页切换到另一个标签页和另一个标签页时,即调用

onCreateView() & onActivityCreated() 每次。

这就是我的代码性能缓慢的原因。

那么,还有其他解决方案吗?如何提高片段标签的性能?

【问题讨论】:

您能从onCreateView()onActivityCreated() 发布您的代码吗? 您是否在片段中尝试过 setRetainInstance(true)? 【参考方案1】:

听起来像是设计的味道。

重新设计您的代码,以便异步完成繁重的工作。片段应该能够快速构建。如果需要进行任何大型处理以使 Fragment 显示有用信息,则应在创建 Fragment 后提前或异步完成该工作,并在工作完成时通知 Fragment 更新其内容.

【讨论】:

同意。如果onCreateView()onActivityCreated() 加起来的时间超过几毫秒,那你就错了。【参考方案2】:

您应该注意的第一件事是注意计算/加载大量数据应该放在与主 UI 线程不同的工作线程上。最好的选择(在我看来)是使用AsyncTask。您可以在 Fragment 中使用类似的东西:

private class LoadData extends AsyncTask<Void, Void, Void>

      @Override
      protected void onPreExecute()
          super.onPreExecute();
          // this is the place where you can show
          // progressbar for example to indicate the user
          // that there is something which is happening/loading in the background
      

      @Override
      protected void doInBackground(Void... params)

          // that's the place where you should do 
          // 'the heavy' process which should run on background thread
      

      @Override
      protected void onPostExecute(Void result)
          super.onPostExecute();
          // you should update your UI here.
          // For example set your listview's adapter
          // changes button states, set text to textview and etc.
      

这是让您的标签工作更快的方法。希望这对您有所帮助! :)

【讨论】:

【参考方案3】:

我找到了解决方案。我在创建时插入了所有网络服务和数据库事务代码。因为 oncreate 每次都不会调用,直到 ondestroy 没有调用。并且我们也可以使用另一种解决方案

片段.show();

& 片段.hide();方法

【讨论】:

听起来你的想法是对的。然而,最终目标是 Fragment 不必与它们的活动对话来检索数据。应该为他们提供自己获取数据所需的所有资源引用。毕竟,这就是 Fragments 的意义所在。活动只是负责初始化和导航的容器。 @saunik Sing:你能告诉我在哪里必须使用 fragment.show() 和 fragment.hide()。我必须重写 onTabChanged 函数吗??【参考方案4】:

作为 android-Developer 的补充:如果您已经在使用 AsyncTask,请记住,即使您使用多个 AsyncTask,它们也会在后台执行,但都是按顺序执行的!如果您想要更多线程来处理您的任务,请查看这篇文章,它完美地解释了如何实现这一目标! Running multiple AsyncTasks at the same time -- not possible?

【讨论】:

这取决于您运行的版本和设备硬件。异步任务在线程池上执行,其中简单的情况是 1 个工作线程池。这也是框架某些版本的默认设置。

以上是关于Fragmenttabhost 性能慢?的主要内容,如果未能解决你的问题,请参考以下文章

fragmentTabHost 使用示例

FragmentTabHost 图形布局不呈现

FragmentTabHost+Fragment搭建应用主框架

FragmentTabHost + Fragment 使用小记

android中 Fragment+FragmentTabHost

FragmentTabHost切换Fragment时避免UI重新加载