【问题标题】:Call a non static void from another class从另一个类调用非静态 void
【发布时间】:2012-11-09 01:10:44
【问题描述】:

我正在尝试结束一个永无止境的循环。我需要从另一个类中调用一个非静态的 void。我不让它静态的原因是有些东西很难静态化。 (静态空隙内的所有东西都必须是静态的)。

我被困在一个圈子里,我需要从另一个类中调用一个非静态 void。我不能让它成为静态的,因为它有些代码不喜欢被传递。

到目前为止,我通过处理程序解决了它:

public static void change(){
//This is called to change a boolean
start=true;}

private void startDone(){
int timeBetweenChecks = 50;
final Handler h = new Handler();
h.postDelayed(new Runnable(){
    public void run(){
        if (start==false){
           startDone();

        } else{  
            //Do something          
        }          
        }
    }
}, timeBetweenChecks);

};

问题在于我必须运行一个处理程序来检查是否经常发生变化(在我的情况下)。

有没有办法直接调用非静态的startDone()?

【问题讨论】:

标签: java android boolean static-methods


【解决方案1】:

如果您问是否有一种方法可以调用类的非静态方法 不实例化该类的对象,那么没有。

如果我没有狗,我不能让我的狗坐下。

【讨论】:

  • 你知道比处理程序更好的解决方法吗?
  • 假设这确实适用于 Android 应用程序,那么其他一些用户提出了一些很好的解决方案。我会尝试其中一种(newbyca 的广播方法看起来很有希望)。同样,根据您要实现的具体目标,Observer 模式(在 Java 中通常被视为不同类型的 listeners)也可能是合适的。
  • +1 就是很好的例子,但我接受 newbycas answear,因为他也为我的问题提供了解决方案。
【解决方案2】:

您的问题的答案是:不,如果没有包含非静态方法的类的实例,您不能从静态方法调用非静态方法。

解决您的问题:也许最好的方法是从 change() 广播意图。

类似:

public static void change(Context c){
    start=true;
    c.sendBroadcast(new Intent("CHANGE_HAS_BEEN_CALLED"));
}

然后在您的活动的非静态代码中,您可以像这样注册接收器:

IntentFilter filter = new IntentFilter();
filter.addAction("CHANGE_HAS_BEEN_CALLED");
registerReceiver(new BroadcastReceiver() {
    @Override public void onReceive(Context context, Intent intent) {
       if (start==false){
           startDone();

        } else{  
            //Do something          
        }
    }
}, filter);

【讨论】:

  • 可以从其他类发送广播,对吧?
  • 可以从任何类发送广播,您只需要一个 Context 实例。
  • 所以它会发送它,当它收到它会调用onRecieve? (只要我在清单中定义广播接收器。)
  • 就是这样,是的!但在这种情况下,您不需要在清单中声明 Intent。你只需要你希望其他应用程序知道的意图。如果它是一个单独的类,你只需要在你的清单中声明接收者。你也可以在普通的Activity中实现receiver,避免额外的配置(这是典型的做法)。
【解决方案3】:

根据定义,如果 startDone() 是非静态的,那么调用它是没有意义的,除非你已经实例化了包含它的类。非静态方法是一个实例方法,这意味着它可以为其封闭类型的每个对象返回不同的结果。

我认为你想要的是一个只包含 startDone() 的类。您希望为整个应用程序实例化一次该类,然后能够调用 startDone()。

假设该类名为ItsDone。将其实例化为单例,然后在执行“新建”时返回单例,并调用 startDone()。

【讨论】:

    【解决方案4】:

    正在检查的处理程序 如果某些事情经常发生变化(以我为例)。

    对我来说听起来像callback。您将一段代码传递给那个“某物”,并且只要“某物”的状态发生变化,这段代码就会被“某物”执行。如果你可以控制这个“某物”,那么实现这种行为就很容易,如果你没有(如果“某物”是某个库的一部分),它可能已经实现了这种行为(当然,如果它很好的话-设计)。

    无论如何,通过每隔 50 毫秒查询一次来检查状态“某事”并不是可行的方法。

    【讨论】:

      【解决方案5】:

      this 问题的公认答案比已经建议的解决方案更好。希望这会帮助任何人在谷歌上搜索。

      【讨论】:

        猜你喜欢
        • 2015-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多