2012-11-15 23 views
0

在之前的會話中(在onPause,onDestroy()之前)創建的Activity的下一次生命中重用Handler對象是否可以?在onDestroy()onPause()之前創建的Activity中使用先前的Handler是否可以?

就像我在Activity中創建一個Handler將其傳播到別處的其他對象一樣,Activity會死或暫停,然後再次重新生活並使用舊的處理程序?

// In the oncreate() method I have this code to recreate handler every time 
    // Then I set the handler to a static Global object 
    // Other Objects use the global object's static method to get 
    //fresh handler every timebefore calling sendMessage() 

     /** 
    * Set up handler 
    */  
    Handler h = new Handler(new Callback() 
    {   
     public boolean handleMessage(Message msg) 
     { 
      handleServiceMessage(msg); 
      return true; 
     } 
    }); 


    uiglobal = new UIGlobals(h); 

UiGlobals被聲明爲

private static UIGlobals uiglobal = null; 

不知道,如果上面的方法是正確的..

我GlobalUI類看起來像這樣

public class UIGlobals 
    { 
     private static Handler handler = null; 
     public UIGlobals(Handler h) 
     { 
      handler = h; 
     } 
     public static Handler getHandler() 
     { 
      return handler; 
     }  
    } 
+0

一般來說,只要舊的處理程序不保留舊的活動(通過掛起的回調等)。代碼示例可能允許更具體的響應。 – Devunwired

+0

我已經更新了這個問題,請看看。謝謝 – Ahmed

回答

0

如果你建立你的自定義處理程序類這應該工作,但如果你已經定義你的自定義處理程序在你的活動註銷onPause中的所有處理程序消息。否則,你會得到一個空指針異常。 但我不知道你在哪裏需要這個功能......我正常使用Handler進行UI訪問,但是用於活動和邏輯觀察者模式之間的通信。

+0

基本上這是爲了溝通bw活動和服務線程。線程sendMessage()將數據通過處理程序引用返回給它們。當「活動」消亡然後復活時,它不知道線程在服務中發佈的最近消息。 – Ahmed

+0

我正在使用廣播服務<->與自定義意圖過濾器的活動/線程通信。作品非常好! –

+0

任何例子都不錯,有幫助 – Ahmed

0

如果您的處理程序是靜態的並且Application(而不是活動)未從內存中移除,則下次活動啓動時,靜態對象將在那裏。

如果您的處理程序是靜態的,並且Application已從內存中移除(即服務,線程等全部停止並且您退出唯一活動的活動),則下次啓動活動時,將重新啓動該對象,並且靜態對象將被重新創建。

如果您的處理程序不是靜態的,那麼您應該在每次創建活動時重新創建它,當然,您將獲得一個新的。

如果您想要更具體的答案,您需要發佈代碼或更具體地瞭解您的情況。

+0

我已經提出了一些代碼,請記住。假設進程沒有死,只有活動沒了,我的處理程序每​​次都存儲在一個新的Global對象的靜態變量onCreate中 – Ahmed

+0

您發佈的代碼不會重用先前處理程序。正如你所說的,你在'onCreate()'中創建一個新的處理程序,並將其分配給'UIGlobals'。只要你分配一個新的處理程序,舊的就不見了。此外,從上面的代碼中可以看出,鏈接到您的活動的處理程序將在活動停止時由服務保留在用戶的使用中,這可能會導致內存泄漏。 – Luis

相關問題