私のコードは、複数のユーザーにメールを送信するためのものです。ユーザーは送信ボタンをクリックし、rpc が呼び出されます。ユーザーが [キャンセル] ボタンをクリックすると、進行中の rpc がキャンセルされます。. 誰でも助けることができますか?
私はよくグーグルで検索しましたが、彼らは Request Builder の概念を導入しました。しかし、私は完璧なアイデアを得ていません。
非同期メソッドがRequest
代わりにa を返すvoid
ようにして、それを呼び出すことができるようcancel()
にします。
同じ理由で、非同期メソッドには戻り値の型がありません。通常は void を返します。保留中のリクエストの状態をより細かく制御したい場合は、代わりに Request を返します。
参考までにRequestBuilder
、戻り値の型として使用することもできsend()
ます。実際にサーバーに要求を行うには、自分でメソッドを呼び出す必要があります (ヘッダーの追加など、要求をカスタマイズした後)。
もちろん、サーバーに処理を中止するように指示する必要がある場合は、別の RPC 呼び出しを行う必要があります。
リクエストは非同期であるため、クライアント側は必要なことを何でも実行できます。要求をキャンセルする必要があることを示すフラグを追加し、onSuccess
メソッドを変更してフラグをチェックし、フラグが設定されている場合は何もしないだけです。
requestCancelled
リクエストを行うたびにフラグをクリアする必要があります。そうしないと、最初のリクエストがキャンセルされた後、別のリクエストを行うことができなくなります...
例えば
boolean requestCancelled = false;
void onSuccess(...)
{
if (!requestCancelled) {
// actual response handing code
}
}
サーバー側で本当にリクエストをキャンセルしたい場合は、はるかに複雑です。これを行うには、2番目のリクエストを送信します。これは、機能がリクエストをキャンセルすることです。これを機能させるには、「キャンセルリクエスト」は「メールリクエスト」が読み取れる場所にフィールドを設定する必要があります。「メールリクエスト」では、「キャンセルフィールド」が設定されているかどうかを確認する必要があります。
// server side Impl
void cancelRequest()
{
// You need to implement this class and ensure it really is a singleton
// and thread safe.
RequestStatusSingleton.setCancelled(true);
}
void serverSideEmailFunc()
{
while(modeEmailAddrs && ! RequestStatusSingleton.getCancelled()) {
// get next address and send email
}
}
明らかに、これは多くの作業です。あなたは考えましたか:
私はあなたのユーザーを完全に理解しています。誰も 15 秒間待ちたくありません。
サーバー/データストアがどこに実装されているかを知る方法がないため、リクエストを「強制終了」する標準的な方法はありません。ロールバックできる単一のトランザクションに入れることができるプロセスを扱わない限り、独自のロジックを実装する必要があります。たとえば、サーバーにエンティティを保存するように要求した場合、このエンティティを再度保存するようにサーバーに指示する必要がありますが、今回は変更はありません。
また、ユースケースについてもう一度考えてみてください。ユーザーがリクエストを強制終了したいのはなぜですか? 彼は単にアプリ内の別の場所に行きたいだけなのかもしれません。その後、リクエストを強制終了する必要はありません。レスポンスが到着したら、ユーザーがまだ同じ場所で辛抱強く待っているかどうかを確認します。そうでない場合は、onSuccess() を実行しないでください。