2010-06-10 55 views
2

例如說我有這樣的代碼在我的活動:Android的呼叫從一個線程外部功能

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    Thread cThread = new Thread(new Runner()); 
    cThread.start(); 
} 

private NotifyMe(){ 
    //do something here 
} 

,這是我的亞軍類:

public class TCPClient implements Runnable { 
    public void run(){ 
     //call NotifyMe() [THIS IS MY QUESTION] 
    } 
} 

我有我的活動線程運行Runner類。 一旦線程啓動,我想調用位於該活動的NotifyMe()函數 。這可能嗎? 如果您不明白我的問題,請讓我知道。

回答

1

您可以將構造函數添加到接受活動引用的TCPClient中,將notifyMe方法更改爲public,然後調用存儲在該線程中的活動對象上的notifyMe方法。

您將遇到的問題是活動可能會在您的線程運行時被關閉,暫停和銷燬。要檢查活動是否仍然有效,請使用活動中的isFinishing()方法。

如果您的活動使用大量內存,此解決方案有點危險,因爲對線程中的活動的引用將使垃圾收集器無法回收活動中UI的可繪製使用的內存等,直到線程被執行並且可以被垃圾收集。如果你的活動在記憶中並不那麼沉重,那應該沒問題。如果是,或者如果你想從多個活動的線程訪問數據看看這個question

如果您有一個非常小的線程,在您的應用程序運行的整個過程中不運行,則或多或少無關的註釋使用AsyncTask。這將允許您將簡單的操作放入後臺。

+0

是的。我遵循你的第一個建議,它爲我工作。謝謝。如果你不介意,我想提出一個後續問題。 在我的NotifyMe()方法中,我試圖調用Toast.maketext,但它會產生一個異常.. java.lang.RuntimeException:Can'在沒有調用Looper.prepare()的線程內創建處理程序。 .. 什麼導致此異常?但是,如果我刪除Toast.maketext,它不會導致問題。 – junmats 2010-06-10 09:06:37

+0

爲此創建一個新問題(如果需要澄清,請鏈接到此問題)並將鏈接發回到此處,然後我或其他人可以以適當的方式回答它 – Janusz 2010-06-10 09:42:35