2012-01-22 6 views
1

私はApache Commonsを使用してHTTPコールを作成しています。私の活動では、呼び出しを行うスレッドがあります。デバイスから電話がかけられ、そこに座って接続すると(ネットワークが輻輳していて、通話に時間がかかるとしたら)、ユーザーはアプリを終了し、アクティビティはバックグラウンドになります。私の電話はどうなりますか?そのことについて(考えてみると)アクティビティ内で開始されたスレッドはどうなりますか?私がそこに座ってそのスレッドを実行していて、それが何であれ、アクティビティが閉じられている場合は、自分自身をonPause()のスレッドを処理する必要がありますか?実行中のアクティビティが閉じている場合、アクティブなHTTPコールはどうなりますか?

編集... したがって、Ted Hoppの答え​​を考えれば、Apacheリクエストを殺す正しい方法は何ですか?私はCommons documentationを見ていて、彼らはトリックをするように見える*たくさんのメソッドがありますが、ドキュメントは細部に欠けているので(物事を指定しない場合にはなぜ医者に気を配っていますか? !)私は、私の接続が座っているスレッドを殺す前に、私は自分のHttpConnectionオブジェクトで呼び出す必要があるメソッドのうちに疑問に思っていますか?

答えて

2

アクティビティを閉じることは、アクティビティがホストされているプロセスに直接影響しません。その他のスレッドはすべて実行を継続します。 life cycleメソッド(、onDestroyなど)の1つ以上を無効にして、アクティビティが終了していることを検出し、実行中のスレッドを中断または終了します。アクティビティメソッドisFinishing()は、シャットダウンされているアクティビティと、コンフィグレーションが変更されたために破棄され再開されたアクティビティを区別するのに便利です。

あなたのスレッドには、実行をキャンセルする方法を記述する必要があります。特にapache-commonsでは、そのメソッドには2つのステップが必要です。まず、HttpClient.execute()メソッドに渡したメソッドに対して、abort()を呼び出す必要があります。あなたが実際にこの方法でIOExceptionを投げると、すべてを停止するには十分であるだけで、最後のステップを、行う場合、実際に

client.getHttpConnectionManager() 
    .getConnection(client.getHostConfiguration()).close(); 

:第二に、あなたは接続自体を閉じる必要があります。

+0

恐ろしいです...私のApacheの質問の詳細を尋ねると、HTTPリクエストを強制終了するにはどうしたらいいですか? –

+0

スレッドがネットワークリクエストでブロックしている場合は、スレッドまたはHTTPリクエストを強制的に停止しようとするのではなく、コースを実行させるのが最善です。アプリを悲しみから救うだけでなく、おそらくサーバーも保存していますか?あなたのスレッドがHTTP要求から戻った後、正常に終了して、アクティビティがなくなったことを確認してください。 –

+0

@Barry Fruitman、私はあなたのことを聞いていますが、私の特定のケースでは、サーバーが静かに最終的に要求が遅れることになることは本当にありません。それに応答するクライアントを持っていない場合、私はむしろそれを介して取得していないだろう。 –

0

Googleは、開発者にActivityでHTTPコールを行わないように強く勧めます。 Serviceが推奨モデルです。 Androidアプリは多くの理由で一時停止されます。最も一般的なのは、通話、SMSまたは電子メールに応答することです。私はあなたがコールをキャンセルすることを望んでいるとは思わないので、ユーザーが戻るときに、それがバックグラウンドですべて起こる可能性があるときに、ユーザーが再びそれを待たせるようにしてください。

最良の選択肢は、ServiceまたはIntentServiceを使用して呼び出しを行い、データを(おそらくSQLiteデータベースに)保存することです。 Activityが再開されると、データベース内の新しいエントリを単に確認することができます。

まだご覧になっていない場合は、Google I/O 2010の「Developing Android REST Client Applications」をご覧ください。PDFダウンロードリンクに注目してください。

+0

ありがとう、私は実際にすべてのことを認識していますが、残念ながら、この特定のケースでは、アクティビティによって呼び出される必要があります。実際には、ユーザの出発は、接続が切断された場合に接続を終了する必要があります。途中経過。ほとんどの場合、同じユーザーが戻ってこないので、サービスの反応によって応答が呑み込まれないようにすることが重要です(これは多数の不特定のユーザーによって使用されるキオスクアプリケーションのカスタムアプリケーションです)。だから私はあなたの一般的な議論の前提に同意しますが、それは私の場合には当てはまりません。 –

関連する問題