【问题标题】:To use getSherlockActivity() or getActivity() or other?要使用 getSherlockActivity() 或 getActivity() 还是其他?
【发布时间】:2013-06-06 17:25:13
【问题描述】:

我有一个带有 TabManager 的 Android 应用。由于 Android API 的更改,我需要升级我的应用程序以使 Activity 包含 Fragment。为了提供向后兼容性,我使用 ActionBarSherlock。

我的应用程序运行良好。但是,查看 Google Play 开发者控制台,总是很少有关于 getSherlockActivity() 行的“java.lang.NullPointerException”的崩溃报告,我认为只有不到 0.1% 的用户受到影响。

例如,

// Example 1    
File file = new File(getSherlockActivity().getCacheDir(), "filename");
// Example 2
getSherlockActivity().setSupportProgressBarIndeterminateVisibility(false);

我的问题: 1.我应该把所有的getSherlockActivity()都改成getActivity()吗?还是在某些规则下,必须使用其中之一? 2. 它们有什么区别?

非常感谢。

【问题讨论】:

  • 低错误率告诉我,这可能是您的活动因资源限制而被操作系统破坏(同时暂停),然后在用户返回时重新创建但没有正确恢复(通常是因为活动状态未正确保存)。您可以通过打开开发人员选项“不保留活动”来测试这一点,然后在您的活动和另一个应用程序之间切换,然后再返回。我发现在打开它的情况下完成我的大部分开发/测试工作很有帮助,它会清除在崩溃报告到达之前您不会注意到的极端情况。
  • 谢谢大家。设法纠正在 Activity 被销毁(按返回按​​钮)后由于 AsyncTask 的 onPostExecute 引起的问题。但是我想知道为什么 Fragment 进程仍然可以运行,因为它的 Activity 已经被销毁了?
  • 那是因为 AsyncTask 就是这样 - 异步的 - 并且已经超出了启动它的 Activity(或 Fragment)。引用 developer.android.com - “AsyncTasks 应该理想地用于短操作”。如果在活动被破坏之前任务还没有完成,我会说它太长了。 AsyncTask JavaDoc 为长时间运行的后台任务建议了替代方法。从本质上讲,AsyncTask 可以从 UI 线程中移除“真正的工作”并阻止 UI 感觉滞后。

标签: android actionbarsherlock


【解决方案1】:

唯一的区别是,使用getSherlockActivity (),您会得到getActivity() 的结果,但会被转换为SherlockActivity。这允许访问 ABS 特定的 API。

如果您只需要在Activity 类中足够通用的东西,只需使用getActivity()。它将突出显示这一点,否则会突出显示您使用getSherlockActivity () 使用特定于 ABS 的东西这一事实。

NPE 可以来自:

  • 在执行 onAttach 之前使用 getActivity()(或兄弟姐妹...)
  • 在 onDetach 执行后使用 getActivity()(或兄弟姐妹...)

因此解决方案是在使用其活动之前检查您的片段是否已附加:

if( isAttached() ) {
   getActivity()....
}

【讨论】:

    【解决方案2】:

    Same topic

    NullPointerException 是normally

    注意:如果您需要在 Fragment 中包含 Context 对象,您可以调用 getActivity()。但是,请注意仅当片段附加到活动时才调用 getActivity()。当 Fragment 尚未附加,或者在其生命周期结束时被分离时,getActivity() 将返回 null。

    【讨论】:

      【解决方案3】:

      此异常可能意味着当片段未附加到活动时正在执行代码。

      getSherlockActivity() 返回的引用在附加 Fragment 时设置,然后在分离 Fragment 时清除(设置为 null)。如果您的代码尝试在此之前或之后引用 getSherlockActivity(),您将获得一个空指针。

      【讨论】:

        【解决方案4】:

        getSherlockActivity 只是一个快捷方式:

        (SherlockActivity) getActivity()
        

        所以在您的情况下,在示例 1 中使用 getActivity() 没有问题,但在示例 2 中它不起作用,因为它是 SherlockActivity 的一种方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-07
          • 2011-08-21
          • 2011-06-11
          • 2015-10-05
          相关资源
          最近更新 更多