2011-11-21 42 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 
相关问题