【问题标题】:Changed Method to Static - Errors?将方法更改为静态 - 错误?
【发布时间】:2013-07-16 23:07:49
【问题描述】:
public static void createAlarms() {
    totaltimetaken = totaltimetaken + timetaken;
    totalcost = totalcost + costone; 
    cal = Calendar.getInstance();
    //cal.add(Calendar.HOUR, alarmintervalint);
    cal.add(Calendar.SECOND, alarmintervalint);
    calintent = new Intent(this, AlarmBroadcastReceiver.class);
    calpendingintent = PendingIntent.getBroadcast(this.getApplicationContext(), 12345, calintent, 0);
    am = (AlarmManager)getSystemService(Activity.ALARM_SERVICE);
    am.set(AlarmManager.RTC_WAKEUP, alarmintervalint, calpendingintent);
}

我已将此方法设为静态,因此我可以将其称为同一项目的另一个类。我在这些行上遇到错误:

calintent = new Intent(this, AlarmBroadcastReceiver.class);
    calpendingintent = PendingIntent.getBroadcast(this.getApplicationContext(), 12345, calintent, 0);
    am = (AlarmManager)getSystemService(Activity.ALARM_SERVICE);

1) 不能在静态上下文中使用“this”
2) 无法从类型中对非静态方法getSystemService(String) 进行静态引用

我将如何解决这些错误?非常感谢!

【问题讨论】:

    标签: java android static-methods


    【解决方案1】:

    阅读Why can't we use 'this' keyword in a static method

    所以解决方案是使用参数化方法并将Context 发送到参数中并使用context 代替this

    作为

    public static void yourMethod(Context mContext) {
    
    calintent = new Intent(mContext, AlarmBroadcastReceiver.class);
        calpendingintent = PendingIntent.getBroadcast(mContext.getApplicationContext(), 12345, calintent, 0);
        am = (AlarmManager)mContext.getSystemService(Activity.ALARM_SERVICE);
    }
    

    所以你的方法应该是

    public static void createAlarms(Context mContext) {
        totaltimetaken = totaltimetaken + timetaken;
        totalcost = totalcost + costone; 
        cal = Calendar.getInstance();
        //cal.add(Calendar.HOUR, alarmintervalint);
        cal.add(Calendar.SECOND, alarmintervalint);
        calintent = new Intent(mContext, AlarmBroadcastReceiver.class);
        calpendingintent = PendingIntent.getBroadcast(mContext.getApplicationContext(), 12345, calintent, 0);
        am = (AlarmManager)mContext.getSystemService(Activity.ALARM_SERVICE);
        am.set(AlarmManager.RTC_WAKEUP, alarmintervalint, calpendingintent);
    }
    

    【讨论】:

    • 有道理,非常感谢!但是方法的实际功能不会改变吧?
    • 但是假设我会在某个地方调用这个类,我会怎么做?抱歉,我对调用方法不太熟悉。我的意思是如果我只是说“createAlarm();”它给了我一个错误。
    • 你从哪里调用这个方法?活动/服务/接收者?每个组件都有一些获取 Context 对象的方法...
    • 在Activity中你可以调用ActivityName.this或者getApplicationContext(),和Service一样。但在 Receiver 中,您将从 onReceive 中获取上下文
    • 活动。就像同一活动的不同方法一样。而且在整个不同的班级之后。就像下面的帖子一样,我只是使用了“createAlarms(this);”它奏效了。谢谢!
    【解决方案2】:

    简单地说,静态类没有this指针。您应该将其作为参数传递:

    public static void createAlarms(final Context context) {
        ...
        calintent = new Intent(context, AlarmBroadcastReceiver.class);
    }
    

    然后你从活动中调用它:

    createAlarms(this);
    

    或来自片段;

    YourActivity.createAlarms(getActivity());
    

    【讨论】:

      【解决方案3】:

      由于只能通过静态方法访问静态成员,而 getSystemService 是非静态方法,所以不能这样做。

      选项 1:您可以删除 static 关键字,然后从对象调用您的方法

      或者

      选项2:您可以将getSystemService的代码移动到其他非静态方法中。您可以从其他非静态方法中调用它

      【讨论】:

        【解决方案4】:

        当我们想要引用类的当前对象时使用这个引用, 静态方法和变量在类的主要对象和对象之前被加载,, 要么避免使用这个词,要么让你的方法非静态

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多