2013-08-20 3 views
0

Я делаю приложение, когда исходящий вызов выполняется на определенный номер (назовем его 123456789), он попытается отправить HTTP-сообщение URL-адресу с несколькими цифрами и дождитесь ОК, а затем позвоните.Приостановить и отправить сообщение HTTP на исходящий вызов Android

Однако, если этот HTTP POST занимает больше, чем, скажем, 4 секунды, то мы добавляем цифры в виде DTMF на исходящий номер.

Проблема в том, что на Android основная тема не должна (или не может) быть усыпанной, или , иначе телефон станет не отвечать на запросы, а затем сбой, поэтому мне нужно найти ожидание задержки вызов делается на 4 секунды, а я делаю POST.

Вот как выглядит код. Я не собираюсь использовать конкретные строки кода, но я больше пытаюсь понять, как заставить телефон ждать результата сообщения, прежде чем передавать вызов.

public class OutgoingCallReceiver extends BroadcastReceiver { 

public void onReceive(Context pContext, Intent intent) { 

Context context = pContext; 
String action = intent.getAction(); 

String digitsToSend = ",1234"; 
String outgoingNumber = getResultData(); 

if (action.equals(Intent.ACTION_NEW_OUTGOING_CALL) 
    && isNetworkAvailable(pContext) 
     && outgoingNumber.equals("123456789") { 

    try{ 
     //We set a HTTPConnection with timeouts, so it fails if longer than 4  seconds 
     HttpParams httpParameters = new BasicHttpParams(); 
     HttpConnectionParams.setConnectionTimeout(httpParameters, 2000); // allow 2 seconds to create the server connection 
     HttpConnectionParams.setSoTimeout(httpParameters, 2000); // and another 2 seconds to retreive the data 
     HttpClient client = new DefaultHttpClient(httpParameters); 

     HttpGet request = new HttpGet(url); 
     HttpResponse response = client.execute(request); 

     HttpEntity entity = response.getEntity(); 
     if (response.getStatusLine().getStatusCode() == 200){ 
      //Success 
      setResultData(outgoingNumber); 
     } 

    } catch (Exception e){ 
      //Took too long, sending digits as DTMFs 
     setResultData(outgoingNumber+digitsToSend); 
    } 
} 
} 

ответ

0

У вас есть 2 возможных решения: Либо использовать обратные вызовы и осуществлять их в методе вы вызываете от вашей основной деятельности, так что, когда запрос заканчивается, вы можете продолжить с кодом оттуда. (лучшее решение) Или вы также можете использовать функцию countdownlatch, которая в основном похожа на красный светофор, который «останавливает» код, пока вы его не отпустите. Вот как это работает:

final CountDownLatch latch = new CountDownLatch(1); // param 1 is the number of times you have to latch.countDown() in order to unlock code bottleneck below. 

latch.countDown(); // when you trigger this as many times as set above, latch.await() will stop blocking the code 


try { 
      latch.await(); //wherever u want to stop the code 
    }catch (InterruptedException e) { 
      //e.printStackTrace(); 
    } 
Смежные вопросы