2014-03-13 41 views
22

我有一個自定義視圖,該視圖運行一個線程操作,它週期性地調用Interwebs。我想知道是否有一種方法可以讓我不必從父Activity(onPause)中刪除該線程,以便在Activity被禁用後(和/或終止)後線程不會在後臺碾磨。定製的View可以知道onPause被調用了嗎?

這裏的意圖是自定義視圖是自給自足的,不需要額外的處理。做到這一點的方法是讓它監聽它的父代是否在後臺,並讓它讓線程中的無限睡眠循環過期。我沒有辦法做到這一點,但我希望我能忽略一些東西。

回答

8

除非您直接通知它。

爲了您的目的,請覆蓋View.onDetachedFromWindow()並放棄您的主題。然後,當視圖再次可見時,將線程旋轉回View.onAttachedToWindow()。 onPause()和onResume()的問題在於,您仍然可以在屏幕上看到一個可見的視圖,但該視圖附加到已暫停的活動。這種情況發生的一個例子是,如果你在一個覆蓋另一個的窗口中有一個活動。

或者,威廉gouvea建議,因爲它已經有暫停和恢復,而且什麼反正會談到網絡真正落在控制器境界的生命週期掛鉤片段可能更適合你的目的。

+0

啊!這正是我要找的,謝謝。 –

+0

'onDetachedFromWindow()'不一定在按下主頁按鈕後臺應用時調用。 –

2

如果您只是重寫View類並創建自己的CustomView,則可以創建一個接口作爲監聽器,該監聽器應該由您的父級活動來實現,因此當發生事件時觸發事件並建立這些事件之間的通信組件來回。

根據你想要達到的目的,碎片可能很有用,因爲這個組件有你自己的生命週期,類似於活動(例如onPause/onResume),擁有你自己的狀態,有或沒有視圖,並且可以保留它們的狀態在配置瑣碎之間。

查看更多在: http://developer.android.com/reference/android/app/Fragment.html http://developer.android.com/guide/components/fragments.html

29

是的,你可以使用下面的代碼,

@Override 
protected void onVisibilityChanged(@NonNull View changedView, int visibility) { 
    super.onVisibilityChanged(changedView, visibility); 
    if (visibility == View.VISIBLE) //onResume called 
    else // onPause() called 
} 

@Override 
public void onWindowFocusChanged(boolean hasWindowFocus) { 
    super.onWindowFocusChanged(hasWindowFocus); 
    if (hasWindowFocus) //onresume() called 
    else // onPause() called 
} 

@Override 
    protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     // onDestroy() called 
} 

@Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     // onCreate() called 
} 
+1

附加/分離生命週期不嚴格模仿創建/銷燬生命週期。但是,是的,如果附加了視圖而不是其活動已創建。但是,在觀點被分離後,其活動不能保證被破壞。嘗試切換最近的菜單。 – dcow

+1

當顯示活動選項菜單溢出彈出窗口時,請注意:窗口失去焦點(並調用onWindowFocusChanged(false))。我曾經在onWindowFocusChanged()中刷新了ListView,它有一個不幸的副作用,就是丟失了選定的項目,這在ActionMode的溢出菜單中尤其惱人。 因此,我正在考慮使用Application.registerActivityLifecycleCallbacks()並對所有感興趣的視圖(例如通過實現某個接口)進行某種回調。 –

相關問題