onIncomingCall()
是來自第三方庫pjsip
中的類的重寫方法。當使用SIP進行來電時,將調用此方法。不知何故,如果呼叫應答代碼在同一方法內或在同一方法內調用,該方法可以使呼叫得到回答。但是我希望在用戶按下按鈕時可以接聽電話。我創建了一個回叫,並在呼叫來臨時讓用戶按下按鈕,但如果呼叫應答代碼在onIncomingCall()
方法之外被呼叫,則該呼叫應答代碼不起作用。所以我決定把Thread.sleep(10000)
放在onIncomingCall()
,當用戶按下按鈕時,我想取消這個線程,這樣就可以執行呼叫應答代碼。我使用Thread.currentThread().interrupt()
,但Thread.sleep
沒有取消。我編寫了一個單獨的活動來測試這個功能,但它失敗了,這意味着Thread.currentThread.interrupt
根本不適合我。實現這個目標的最佳選擇是什麼?請更新我..我真的很苦惱。Thread.currentThread()。interrupt()不適用於Android
@Override
public void onIncomingCall(OnIncomingCallParam prm) {
onIncomingCallParam = prm;
try {
Thread.sleep(10000);
} catch(InterruptedException ie) {
ie.printStackTrace();
}
answerCall();
}
UPDATE:
我固定下面的方法
resetThread();
while (testThread) {
try {
Log.d(TAG,"testThread true");
Thread.sleep(1000);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
Log.d(TAG,"Call Answering code");
private void resetThread() {
Thread newThread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10000);
testThread = false;
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}
});
try {
newThread.start();
} catch (Exception ie) {
ie.printStackTrace();
}
}
您必須從與正在休眠的線程(B)不同的線程(A)調用'interrupt()'。因此,從線程A開始,您需要調用'threadB.interrupt()' - 此時您正在中斷線程A,這沒有任何意義。 – assylias
@assylias線程上調用Thread.sleep。如何區分線程A和線程B – praneel
您可以在'onIncominCall()':'sleepingThread = Thread.currentThread();'中使用變量(可能需要變爲volatile),並在其他代碼中調用sleepingThread。中斷()'。但更有可能你應該改變你的設計 - 使用Thread.sleep()'確實是一種代碼味道。 – assylias