通常,回調將發生在事件正在運行的線程上。如果您註冊回調並在非UI線程上開始播放內容,則回調將發生在非UI線程上。但是,Android不會自行在後臺創建新線程。
所有與UI相關的事件都必須在UI線程上發生,因此您可以確信點擊處理程序回調等將發生在UI線程上。正如Aaron C所指出的那樣,你可以使用Activity.runOnUiThread來強制事件在那裏發生。
此外,AsyncTask對於快速後臺工作可能非常有用,您需要完成一些步驟才能在uI線程上進行測試。
編輯:來自評論的示例。
public void MyWorker {
private OnCompleteListener onCompleteListener;
public void setOnCompleteListener(OnCompleteListener onCompleteListener) {
this.onCompleteListener = onCompleteListener;
}
public void doWork() {
// do lots of work here
onCompleteListener.onComplete();
}
}
// somewhere in my Activity
public void onCreate() {
final MyWorker worker = new MyWorker();
worker.setOnCompleteListener(new OnCompleteListener() { ... });
new Thread(new Runnable() {
public void run() {
worker.doWork();
}
}).start();
}
在此示例中,onComplete「回調」將從非UI線程運行。線程將在onComplete完成後退出。
我試圖運行的異步操作,而在我的服務(使用'RxAndroid'),調用提供了使用'AndroidSchedulers.mainThread()'這個操作的客戶端回調。在調試時,我可以確認在主應用程序線程中調用的回調。 **然而,在調用回調之後,在主應用程序線程中,在回調(在客戶端)運行*的代碼不是**。不過,是否可以保證我的服務客戶端的回調代碼將在主應用程序線程中運行,因此他們不需要處理它? – Eido95 2016-11-21 08:09:31
@ Eido95:我建議你問一個單獨的Stack Overflow問題,在這裏你可以用[mcve]詳細解釋,你關心的是什麼。 – CommonsWare 2016-11-21 12:25:28