2011-09-28 17 views
8

我有一個奇怪的問題,我的應用程序 -onStart()之後直接調用片段onStop() - 爲什麼?

一個有一個包含片段的片段活動 - )該片段啓動一個的AsyncTask的onCreate(和取消的AsyncTask的onStop()。我的問題出現了,因爲雖然我的片段保持運行&沒有被遮擋,但onStop()在onCreate()後幾乎直接調用。

有誰知道如何跟蹤爲什麼會發生這種情況?

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

編輯

我已經刪除從片段中的代碼,我仍然感到困惑絕對 - 的問題仍然存在!我已經添加了幾行日誌記錄:

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() 

上述行爲是......莫名其妙。在活動中使用的代碼如下所示:

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()被直接從Fragment創建過程調用/引發。

EDIT3

堆棧跟蹤上的onStop()打破時: enter image description here

我要去嘗試,並附源代碼和步發現問題的所在。

回答

8

還是不知道它在做什麼......我研究了從哪裏獲得所涉及的類的源代碼,調用onStop(),並發現android-support-v4.jar的源代碼來與SDK一起打包。

附加此源後,雖然我很快發現它不同步,並且我的android-support-v4.jar與SDK的當前版本附帶的版本大不相同。

將jar替換爲與SDK一起打包的jar可立即修復問題,onStart()之後不會調用onStop()。不知道是什麼錯誤導致了這一點,但最新版本似乎很容易解決它。

+0

謝謝 - 這讓我非常痛苦。我想這是一箇舊版本的suppport庫中的錯誤。 – Tom

相關問題