繁体   English   中英

从另一个类调用非静态void

[英]Call a non static void from another class

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

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

如果我没有狗,就不能告诉我的狗坐。

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

解决您的问题:最好的方法可能是通过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);

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

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

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

一个处理程序,用于检查某些事物是否已经非常频繁地更改(以我为例)。

听起来像是回呼给我。 您将一段代码传递给该“事物”,并且每当其状态发生变化时,该代码段就由“事物”执行。 如果您可以控制这种“某物”,则很容易实现这种行为,如果您没有(如果“某物”是某些库的一部分),则很可能已经实现了这种行为(当然,如果它很好-设计)。

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

与已经提出的解决方案相比, 对此问题的认可是更好的解决方案。 希望这对任何使用Google的人都有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM