2014-04-30 99 views
0

我有一個內部靜態類,它在我的主Activity中擴展了線程。在這個線程中,我需要從我的主Activity調用一個非靜態方法。調用非靜態方法int靜態類

依我之見,我有兩個選擇:

  • 讓我非靜態方法靜態:此選項不會是這種方法裏面可行,因爲我打電話startActivityForResult,我不能在靜態調用此辦法。
  • 在內部靜態類中創建主Activity的對象,並通過此對象調用方法。

    MainActivity mActivity = new MainActivity(); 
    //... 
    mActivity.method(); 
    

我現在使用的一個是第二,但我有一個疑問。如果我這樣做,我明白我正在創建一個MainActivity的新實例,並且執行此操作時,onCreate方法中的所有定義都稱爲?或者我只是調用方法,我在裏面使用的變量將爲空?

更新 -

這是內部類,我需要調用從主要的方法。我需要這是靜態的,因爲應用程序的基本功能需要它這樣。現在我介紹的主要活動的新方法,當一個動作的線程中發生時必須調用:

private static final class DetectionThread extends Thread { 
    //... 

    public DetectionThread(byte[] data, int width, int height) { 

    } 

    @Override 
     public void run() { 

     //DO STUFF HERE 

     //Action happens and calls the method from main activity: 
     SpeechWhenMotion(); 
     //... 
     } 
    } 
} 

這是在主要活動中定義的方法的頭。裏面的是我打電話給這對於結果開始活動的另一種方法,所以這就是爲什麼我不能設置方法爲靜態的原因:

public void SpeechWhenMotion() { 
    //... 
} 
+4

發佈代碼將解釋更多。 –

+2

您不會因爲您將您的方法編碼爲靜態而您不決定使用static關鍵字,反之亦然。看看你是否可以改變你的設計,並思考一下你的邏輯是否在不同實例之間變化,或者始終保持靜態。 – prabugp

+0

內部靜態類如果內部類應該使用外部類的非靜態方法,那麼它看起來應該不是靜態的。你可以添加一些你的設計決定的解釋嗎? – Pshemo

回答

0

傳遞一個MainActivity實例的靜態方法。然後從該實例調用.method()。

static void doSomething(MainActivity ma) { 
    ma.method(); 
} 

這個,或者您發佈的第二個選項。

+0

第二種選擇是錯誤的。永遠不要用'new'實例化活動。 – laalto

1

假設MainActivity是外部類的,我想你在找什麼是

MainActivity.this.startActivityForResult() 

創建另一個對象是不是正確的解決方案。

而且順便說一句,創建一個擴展Thread的類同樣很糟糕。我沒有看到你需要這樣做的理由。除了複雜的線程之外,你需要做的只是實現Runnable()。這樣做可以將您的線程關注與業務邏輯分開。

+0

添加了一些可以解釋更多的代碼 – masmic

相關問題