2011-11-21 41 views
0

我已經擴展了應用程序類是這樣的:何時初始化靜態類?需要從應用程序對象調用的時候,應用程序啓動

public class MyApplication extends Application 
{ 
    private static MyApplication instance; 

    public MyApplication() 
    { 
     instance = this;      
    } 

    @Override 
    public void onCreate() 
    { 
    MyStaticClass.Start() // Here it crashes 
    super.onCreate();  
    } 

} 

那我有我是需要儘快調用一個方法從靜態類的問題隨着應用程序的啓動。然而,看起來靜態類在這個時候還沒有被初始化,所以它崩潰了。在應用程序類中有沒有辦法做到這一點?我不想從一項活動中做到這一點。

謝謝

+0

你什麼異常? –

回答

3

首先,讓我們看看你的靜態類是什麼樣的。其次,你可以在你的application類中做任何你想要的,但只需將該靜態方法調用移動到super.onCreate()的調用之後。第三,發佈日誌!

1

您可能需要重新設計您的應用程序體系結構。例如,「應用程序啓動後」的含義是什麼?

在Android上,「應用程序啓動」的概念與其他平臺不同。

E.g.如果您的應用程序的Java進程在您按主屏幕上的應用程序圖標時仍處於活動狀態,則將不會調用Application.onCreate()。反之亦然 - 如果您的應用程序流程因爲您的應用程序處於後臺(例如,由於來電)而被操作系統殺死,則在調用完成時操作系統恢復應用程序時將調用Application.onCreate()。但從用戶角度來看,這不會是一個「應用程序開始」。

這是關於此的文檔 - Processes and lifecycles

1

靜態類未初始化。它們不是物體。靜態方法不應該使用與狀態相關的信息,靜態變量也不應該改變。它們的存在是爲使用不需要實例的類的人員提供功能和參數。他們還允許你做一些訪問班級私人成員的東西。

實際上,類甚至不是靜態的 - 它們只有靜態成員(方法和變量)。

我想,在MyStaticClass中,方法start()沒有被定義爲靜態,這意味着你必須首先實例化一個MyStatic類實例。

靜態類本質上爲您提供創建子類而不創建子包的機會。他們的工作方式與普通課程完全一樣,但您必須通過他們的MasterClass致電他們。

public class MyClass{ 
    public static class MyStaticClass{ 
     public MyStaticClass(){ 
      //Construct 
     } 
     public void MyMethod(){ 
      //Do stuff 
     } 
     public static void MyStaticMethod(){ 
      //Do Static Stuff 
     } 
    } 
} 

將導致以下屬性:

MyClass C1 = new MyClass();       //Totally Legal 
MyClass.MyStaticClass C2 = new MyClass.MyStaticClass() //Also legal 
MyClass.MyStaticClass.MyStaticMethod()     //Legal 
C1.MyStaticClass.MyStaticMethod()      //Legal, but odd 
C2.MyStaticMethod()         //Also legal, also odd 
C2.MyMethod()           //Legal, intended use. 

C1.MyStaticClass.MyMethod()       //Unconditionally Illegal 
MyClass.MyStaticClass.MyMethod()      //Unconditionally Illegal 
MyStaticClass.MyMethod()        //Unconditionally Illegal 
相關問題