2016-07-13 20 views
1

我想在我的Activity中創建一個靜態演示者對象,以便當由於配置更改而重新創建Activity時,它將保留演示者實例並我的商業邏輯不會受到影響。當由於配置更改而重新創建活動時,活動的靜態成員會發生什麼

Activity的代碼是:

public class HomeActivity extends AppCompatActivity { 

    public static HomePresenter presenter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home); 

     if (presenter == null){ 
      presenter = new HomePresenter(); 
     } 
    } 
} 
+1

它會保持活力。但是,不要忘記從onDestroy中的演示者中刪除所有HomeActivity引用(對於內部類),並在onCreate中再次設置它們,否則會導致內存泄漏。 – CherryPerry

+0

直到活動和你的過程被垃圾收集,它會持續在你的記憶中。如果處理不當,這可能會在某些情況下導致潛在的內存泄漏和異常。 – Kushan

回答

1

靜態實例不會發生任何事情。但是,如果您不刪除對靜態演示文稿的引用,則可能會泄漏內存(請參閱Avoiding memory leaks)。

我會建議另一種方法。當Activity由於配置更改(例如旋轉)而被銷燬時,覆蓋onRetainNonConfigurationInstance()以保留對象。並且在配置更改後使用getLastNonConfigurationInstance()獲取完全相同的對象。

public class HomeActivity extends AppCompatActivity { 

    public HomePresenter presenter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home); 

     presenter = (HomePresenter)getLastNonConfigurationInstance(); 
     if (presenter == null){ 
      presenter = new HomePresenter(); 
     } 
    } 

    @Override 
    public Object onRetainNonConfigurationInstance() { 
     return presenter; 
    } 
} 

你也可以使用一個Fragment保持結構變更時活着的對象,見RetainingAnObject

0

你的代碼將工作,主持人將是活的,但,請不要這麼做。

關鍵字'靜態'表示此字段的值將附加到類,而不是附加到它的實例。因此,如果你舉例說明你的HomeActivity,那麼你去SomeElseActivity,然後去新的HomeActivity(你會回來堆棧HomeActivity - > SomeElseActivity - > HomeActivity)爲新的HomeActivity你將有相同的主持人與舊的。因此,您將有兩個獨立的HomeActivity實例的共享主持人。而且,如果你在演講者身上有一些狀態,在這種情況下你的應用程序會遇到很多問題。

我建議您刪除'static'關鍵字。如果你的演講有狀態,這是需要在配置更改保存,嘗試2層的替代品之一:

1)在你的演講中創建的onSaveInstanceState和onRestoreInstance狀態,並呼籲他們在適當的活動的方法

2)創建沒有ui的片段,但帶有'retain instace'標記(setRetainInstance方法),並且這個片段將繼續引用您的演示者。

0

簡而言之,靜態對象仍然存在,並且當您將類加載到內存中時它會誕生,並且在您的應用程序死亡或者類被卸載之前永遠不會消失。

在JVM語言,編譯器通過嵌入值在字節碼代替計算在運行時的值優化靜態字段。

當您啓動一個JVM並首次加載一個類時(當類以任何方式首次被引用時,這由類加載器完成),任何靜態塊或字段都會被加載到JVM中,並且被加載到中,變得可訪問。

enter image description here

所以靜態變量生活在快照中圈,這是無知的任何配置的變化,它是存在的,無論發生什麼事情只要作爲類加載。

相關問題