2012-02-13 3 views
7

Androidでキューサービスを実装しました。キューサービスとWi-Fi /データ接続イベントに基づいて状態が変更されます。Androidでデータアップロードを効果的にキャッシュする

私は、リモートURLに投稿されるトランザクションをキューに入れます。デバイスにデータまたは無線LAN接続がある場合、キューが空になるか切断イベントが発生するまで、キューを反復してデータをURLに送信します。

私は自分のアプリにログインし、飛行機モードを有効にし、データを生成し、飛行機モードをオフにして、取引を掲載することができます。何千ものトランザクションがあっても、遅くなることはありません。 (私はちょっとそれを噛んでみようとしていた)

入力:低レセプション! 3G受信が低すぎると、アプリの動作が非常に遅くなります。 (はい、すべてのアップロードはuiスレッドから発生します)。この遅さの原因は、サーバーへのポストと非常に時間がかかり、時には失敗することが関係しているようです。

私の質問は、どうすればこの問題を解決できますか?信号品質をチェックしますか?既知の住所に投票しますか? Gmailなどの他のアプリはこれをどのように解決しますか?これは一般的なシナリオでなければなりません!

+3

「接続はありますが、サーバーが遅い、到達不能なetC」のような場合には、計画を立てる必要があります。2つのアイデア:1.キャッシュを維持し、最大サイズを定義します(意味:イベントが投げ捨てられても気にしないでください)。 2. 1回のリクエストにかかる時間を測定する。イベントの生成に要する時間よりも時間が長い場合は、接続またはサーバーの負荷を引き延ばすために時間を長くしてください。 – vasquez

答えて

0

何千ものタスクが実行される可能性がある場合は、必ず管理する必要があります。あなた自身の実装について考えましたThreadPoolExecutor?ドキュメントは非常に良好であり、クラスでは、理解しやすいですが、あなたが必要な場合の例は、これらのサイトを試してみてください。

この利点は、あなたが最大を制限することができるということですスレッド数を妥当な数に制限するとシステム全体の速度が低下することはありません(Androidの場合は20を推奨しません)。

+0

私は並行してアップロードを実行していません。一度に1つのアップロードが行われます。はい、アップロードキューは「メイン」アプリケーションとは別のプロセスですが、アップロードは一度に1つしか発生しません。私はあなたの提案を誤解していますか? – Jonathan

+0

一度に1つのタスクしか実行しておらず、タスクがバックグラウンドで実行されている場合、なぜUIが遅くなるのですか?それとも百万ドルの質問ですか? :) –

0

ソケットとconenctionタイムアウトの微調整を行うことができますか?したがって、接続が遅く、停止している場合は、タイムアウトが発生し、送信が失敗します。

接続/送信が失敗した後で、後で送信を再試行するか、別の操作を行うことができます。我々は我々のアプリケーションのために似たような状況を持っている

HttpParams httpParameters = new BasicHttpParams(); 

HttpConnectionParams.setConnectionTimeout(httpParameters, 30 * 1000); 
HttpConnectionParams.setSoTimeout(httpParameters, 15 * 1000); 

HttpClient client = DefaultHttpClient(httpParameters); 
// use client... 
0

次のコードを使用することができ、タイムアウトを調整します。私たちは、シグナルの問題を現実と考え、いつでも起こり得る問題を考えました。私たちが従うポイントの1つは、サーバーからの機能確認を得ず、httpステータスコードをベースにしない限り、デバイスからコンテンツを削除しないことです。遅いネットワークや、突然信号を失うケースとして、我々のコンテンツを掲載したが、データが部分的にしか受信されなかった多くのケースがあった。それで、サーバーに何らかの方法でデバイスを知らせることにしました。 あなたが尋ねた質問であるパフォーマンスやネットワークのチェック以外にも、アプリケーションの堅牢性のためにこうした動作が必要でした。

0

hereのように、HTTP範囲ヘッダーを使用してチェックアウトする必要があります。

サーバーは読み取り中にディスクにペイロードを書き込み、接続を処理する必要があります。クライアントは実際にサーバに到達したペイロードのバイト数を知ることができないため、ネットワークエラーが発生するたびにサーバと同期を取る必要があります。

0

もっと良い信号を待っていれば、おそらく012CBmaDbm、getEvdoDbm、getGsmSignalStrengthメソッドを持つSignalStrengthクラスがあなたが探しているものです。

0

はこれをチェックしてください: http://www.youtube.com/watch?v=PwC1OlJo5VM#!

は、ヒントやトリック、帯域幅を節約する技術、実装パターン、あまり知られていないAPIの機能の一部を露出し、あなたを確保することで、バッテリーの消耗を最小限に抑える方法への洞察を符号化する高度なアプリは通信事業者ネットワーク上の優れた市民です。

関連する問題