0

特定の番号 (123456789 と呼びましょう) に発信呼び出しが行われたときに、数桁の URL に HTTP 投稿を送信し、OK を待ってから、呼び出しを許可するアプリを作成しています。

ただし、この HTTP POST に 4 秒以上かかる場合は、発信番号に DTMF として数字を追加します。

問題は、Android では、メイン スレッドをスリープ状態にすべきではない (またはスリープ状態にできない) ことです。そうしないと、電話が応答しなくなり、クラッシュします。 POSTを実行している間、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);
    }
}
}
4

1 に答える 1

0

考えられる解決策は 2 つあります。コールバックを使用し、メイン アクティビティから呼び出すメソッド内にそれらを実装して、リクエストが終了したときにそこからコードを続行できるようにします。(最良の解決策)または、基本的にコードを解放するまでコードを「停止」する赤信号のようなカウントダウンラッチを使用することもできます。仕組みは次のとおりです。

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();
    }
于 2013-11-18T15:50:24.743 に答える