使用Application类

时间:2017-07-02 21:11:12

标签: java android android-activity mobile global

我正在尝试使用应用程序类定义全局对象。 因此,我定义了以下类。

public class MyApplication extends Application {

    private MyObject myObject=new MyObject();

    public MyObject getMyObject(){
        return this.myObject;
    }
}

然后,我在一个活动中使用它,但是我收到一个错误(无法解析方法getApplication()):

public class AnActivity extends Activity {

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

    Button buttonMusic=(Button) findViewById(R.id.button5);
    buttonMusic.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            MyApplication myApplication = ((MyApplication)this.getApplication());
            Toast.makeText(MoodActivity.this, "playing music", Toast.LENGTH_SHORT).show();
        }
    });

    }
}

我不知道为什么会出现此错误,因为例如在另一个活动中调用getApplication()时会有效。

我对Android和Java都很陌生,所以请原谅这个问题的独创性。

更新

然后我执行MyObject myObject=myApplication.getMyObject();并且我没有收到任何编译问题,但是一旦我参与该活动,该应用程序就会死亡。

据我所知,不建议将Application类用于此类用途,那么什么是一个好的选择呢?

3 个答案:

答案 0 :(得分:5)

您因为在this.getApplication()内拨打View.OnClickListener而收到此错误。因此,this现在引用了侦听器而不是活动。

要执行您需要的操作,只需在您的活动的Context方法中在聆听者之外创建一个onCreate对象,然后为其指定this。而且,在听众中,使用context代替this。这样的事情: -

public class AnActivity extends Activity {
    Context context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mood);
    context = this;
    Button buttonMusic=(Button) findViewById(R.id.button5);
    buttonMusic.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            MyApplication myApplication = ((MyApplication)context.getApplication());//Changed "the" to "context"
            Toast.makeText(MoodActivity.this, "playing music", Toast.LENGTH_SHORT).show();
        }
    });

    }

}

问题更新后修改:

使用static对象来实现全局变量,而不是使用应用程序类。 static个对象独立于对象,可以使用它们所属的类进行引用。例如,如果您在static中定义MainActivity.class变量并将其命名为testObject,则无论您当前的活动如何,都可以使用以下代码访问该变量: -

YourObject object = MainActivity.testObject;

答案 1 :(得分:1)

除非您有特定的理由在Android中扩展Application类,否则您可能不应该这样做。作为参考,请查看文档中的注释:https://developer.android.com/reference/android/app/Application.html

如果您正在尝试创建可在Android应用中使用的对象,只需像在Java中那样执行此操作:

public class MyObject {
    //Your stuff here
}

如果您有特别想要扩展应用程序类的原因,那么如果您解释了您尝试做的事情,那么人们可以做更多的事情来帮助您。我根本不需要根据你的例子看到所有这些复杂性。

答案 2 :(得分:1)

this更改为AnActivity.this。 在下面的代码中,this的含义从AnActivity更改为View.onClickListener,因为它是另一个对象,并且在这些大括号内,您位于Click侦听器类的范围内

new View.OnClickListener() {
        public void onClick(View v) {
            MyApplication myApplication = ((MyApplication)this.getApplication());
            Toast.makeText(MoodActivity.this, "playing music", Toast.LENGTH_SHORT).show();
        }
    }

所以上面的代码应该变成

new View.OnClickListener() {
        public void onClick(View v) {
            MyApplication myApplication = ((MyApplication)AnActivity.this.getApplication());
            Toast.makeText(MoodActivity.this, "playing music", Toast.LENGTH_SHORT).show();
        }
    }

您可以阅读更多相关信息here