簡體   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