1

非同期ソケット接続を介してサーバーと通信し、やや大きな情報パケット (最大 11 メガバイト) を転送する Android アプリがあります。この相互作用に対応するために、データの送受信の重要なポイントに小さなスリープを配置しました。WiFiでは、接続は機能します。1回の読み取りまたは書き込みでは十分ではないようですが、転送が完了するまでソケットから読み取り続ける関数を作成しました。

私が言ったように、これはすべてWiFiで機能します。ただし、3G またはエッジ ネットワークでは、転送が失敗し、途中で中断され、一般にバグが発生します。情報が通過する機会を確実に与えるために、私は多くのチェックとスリープを配置しましたが、失敗しました。

残念ながら、問題の原因を明確にすることは困難です。私はこの問題を可能な限りエレガントに解決しようと数日間働きましたが、役に立ちませんでした。

TLDNR WiFi はデータを送信できますが、モバイル ネットワークは失敗します。その理由と修正方法を知る必要があります。

ありがとうございました。

4

2 に答える 2

2

実際の問題は、受け取った金額がread()私が予想していたよりも大幅に少なかったことです。私のプログラムでは、プログラムがスキーマの使用方法を理解する前に、スキーマ全体を XML 経由で送信する必要がありました。弦を十分に受け取っていなかったので、死んでしまいました。/schema タグが文字列内にあるかどうかを ( if ( !response.contains("/schema")) を介して) チェックし、それが見つかるかタイムアウトになるまで読み取りを停止しません。

于 2011-05-18T20:48:01.020 に答える
0

中断されたデータ転送を再開できるソリューションが必要になる可能性があります。中断されたダウンロードを再開する方法を見てください-例については、パート2とhttps://stackoverflow.com/search?q=[android]+resume+download

また、AndroidRESTクライアントアプリケーションに関するVirgilDobjanschiのGoogleI / O 2010プレゼンテーションを視聴することを強くお勧めします。このプレゼンテーションでは、このようなデータとネットワーク通信を処理するためのアプリの設計について説明しています。彼はAndroid用の公式Twitterアプリの作者です。

于 2011-05-17T00:10:37.693 に答える