我的应用程序遇到了一个奇怪的问题 -
A 有一个包含片段的片段活动 - 该片段启动 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()
EDIT
我已经从片段中删除了代码,但我仍然感到非常困惑 - 问题仍然存在!我又添加了几行日志记录:
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
Stacktrace when breaking on onStop():
我将尝试附加源代码并逐步找出问题所在。