【问题标题】:Fragment onStop() being called directly after onStart() - WHY?在 onStart() 之后直接调用片段 onStop() - 为什么?
【发布时间】:2011-09-28 10:43:46
【问题描述】:

我的应用出现了一个奇怪的问题 -

A 有一个 Fragment Activity,其中包含一个 Fragment - 此 Fragment 启动 AsyncTask onCreate() 并取消 AsyncTask onStop()。我的问题出现了,因为尽管我的 Fragment 保持运行并且没有被遮挡,但它的 onStop() 几乎是在 onCreate() 之后直接调用的。

有谁知道如何追踪为什么会发生这种情况?

09-28 11:41:56.785: VERBOSE/SearchFragment1(924): onCreate()
09-28 11:41:56.796: VERBOSE/SearchFragment1(924): onStop()

编辑

我已经从 Fragment 中删除了代码,但我仍然非常困惑 - 问题仍然存在!我添加了几行日志记录:

09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onAttach()
09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onCreate()
09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onCreateView()
09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onActivityCreated()
09-28 14:09:00.242: VERBOSE/SearchResultsFragment1(1789): onStart()
09-28 14:09:00.246: VERBOSE/SearchResultsFragment1(1789): onStop()
09-28 14:09:00.246: VERBOSE/SearchResultsFragment1(1789): onStart()
09-28 14:09:00.246: VERBOSE/SearchResultsFragment1(1789): onResume()

上述行为……令人费解。 Activity 中使用的代码如下所示:

if(savedInstanceState == null) 
{
    try {
        FragmentTransaction transaction= getSupportFragmentManager().beginTransaction();    
        Fragment currentFragment= (Fragment)Class.forName(getIntent().getAction()).newInstance();
        transaction.replace(R.id.singlePane, currentFragment);  
        transaction.commit();
    } catch ...

这是调试期间的片段:

private static final boolean LOGGING_ENABLED = true;
private static int global_creation_count = 0;
private int local_count = global_creation_count;

@Override
public void onAttach(Activity activity) {   
    super.onAttach(activity);
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onAttach()");
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    global_creation_count+=1;       
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onCreate()");
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onCreateView()");
    return super.onCreateView(inflater, container, savedInstanceState);     
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, 
    "onActivityCreated()");
}

@Override
public void onStart() {
    super.onStart();
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onStart()");
}       

@Override
public void onResume() {
    super.onResume();
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onResume()");
}

// Fragment is active

@Override
public void onPause() {
    super.onPause();
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onPause()");
}   

@Override
public void onStop() {
    super.onStop();
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onStop()");
}   

@Override
public void onDestroyView() {
    super.onDestroyView();
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onDestroyView()");
}

@Override
public void onDestroy() {   
    super.onDestroy();
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onDestroy()");
}

@Override
public void onDetach() {    
    super.onDetach();
    if(LOGGING_ENABLED) Log.v(this.getClass().getSimpleName() + local_count, "onDetach()");
}   

EDIT2

从代码看来,onStop() 似乎是在 onStart() 之后直接调用的。我试图通过在 onCreateView() 中添加 Thread.sleep(1000) 来查看它是否与 onStart() 同时被调用。输出是相同的 - 这让我相信 onStop() 是直接从片段创建过程中调用/引起的。

EDIT3

在 onStop() 中断时的 Stacktrace:

我将尝试附上源代码并逐步找出问题所在。

【问题讨论】:

    标签: android lifecycle


    【解决方案1】:

    仍然不知道它想做什么...我研究了从哪里获取调用 onStop() 所涉及的类的源代码,发现 android-support-v4.jar 的源代码已打包连同 SDK 中的 jar。

    在附加此源后,我很快发现它不同步,而且我的 android-support-v4.jar 与当前版本的 SDK 附带的有很大不同。

    用 SDK 打包的 jar 替换 jar 可以立即解决问题,并且在 onStart() 之后不会调用 onStop()。不确定是什么错误造成的,但最新版本似乎很容易修复它。

    【讨论】:

    • 谢谢 - 这让我很痛苦。我猜这是旧版本的支持库中的一个错误。
    猜你喜欢
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    相关资源
    最近更新 更多