0

私は終わりのない円を終わらせようとしています。別のクラスから静的ではない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

定義上、startDone()が非静的である場合、それを含むクラスをインスタンス化していない限り、それを呼び出すことは意味がありません。非静的メソッドはインスタンスメソッドです。つまり、それを囲む型のオブジェクトごとに異なる結果を返すことができます。

あなたが欲しいのはstartDone()だけを含むクラスだと思います。アプリケーション全体に対してクラスを1回インスタンス化してから、startDone()を呼び出せるようにします。

クラスの名前がItsDoneであるとします。シングルトンとしてインスタンス化し、「new」を実行したときにシングルトンを返し、startDone()を呼び出します。

于 2012-11-20T21:21:01.603 に答える
0

何かがかなり頻繁に変更されたかどうかをチェックしているハンドラー(私の場合)。

私へのコールバックのように聞こえます。その「何か」にコードを渡すと、このコードは状態が変化するたびに「何か」によって実行されます。この「何か」を制御できる場合、そのような動作を実装するのは非常に簡単です。そうでない場合(「何か」がライブラリの一部である場合)、おそらくこの動作が実装されています(もちろん、うまく機能している場合)。 -設計)。

とにかく、たとえば50ミリ秒ごとにクエリを実行して状態「何か」をチェックすることは、進むべき道ではありません。

于 2012-11-20T21:22:43.393 に答える
0

この質問に対して受け入れられた回答は、すでに提案されている解決策よりも優れた解決策です。これが誰もがグーグルするのに役立つことを願っています。

于 2012-12-25T13:08:47.790 に答える