0

我试图结束一个永无止境的循环。我需要从另一个类中调用一个非静态的 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() 吗?

4

5 回答 5

6

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

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

于 2012-11-20T21:20:29.900 回答
3

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

解决您的问题:也许最好的方法是从 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);
于 2012-11-20T21:25:13.060 回答
0

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

于 2012-12-25T13:08:47.790 回答
0

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

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

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

于 2012-11-20T21:21:01.603 回答
0

一个处理程序,它正在检查某些东西是否经常发生变化(在我的例子中)。

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

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

于 2012-11-20T21:22:43.393 回答