我想结束一个永无止境的圈子。我需要从另一个类调用一个非静态的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()?
答案 0 :(得分:6)
如果你问是否有办法在没有实例化该类的对象的情况下调用类的非静态方法,那么没有。
如果我没有狗,我不能告诉我的狗坐。
答案 1 :(得分: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);
答案 2 :(得分:0)
根据定义,如果startDone()是非静态的,那么调用它是没有意义的,除非你已经实例化了包含它的类。非静态方法是一种实例方法,这意味着它可以为其封闭类型的每个对象返回不同的结果。
我认为你想要的是一个只包含startDone()的类。您希望为整个应用程序实例化一次类,然后可以调用startDone()。
假设该类名为ItsDone。将其实例化为单例,然后在执行“new”时返回单例,并调用startDone()。
答案 3 :(得分:0)
正在检查的处理程序 如果事情经常发生变化(在我的情况下)。
听起来像callback给我。你将一段代码传递给那个“东西”,这段代码只要状态发生变化就会由“某事”执行。如果你可以控制这个“某些东西”,那么很容易实现这样的行为,如果你不这样做(如果“某些东西”是某个库的一部分),它可能会实现这种行为(当然,如果它很好的话) - 设计)。
无论如何,通过每次查询来检查状态“某事”,比方说50毫秒是不可能的。
答案 4 :(得分:0)
this问题的已接受答案是比已经提出的解决方案更好的解决方案。希望这将有助于任何人谷歌搜索。