2012-03-03 4 views
2

私のオンラインサーバに保存されている連絡先をダウンロードし、自分のアクティビティに表示したい。私はサービスを書いており、このダウンロードが行われているonStartCommand関数からコードスニペットを与えています。サーバからアンドロイド2.1のデータをダウンロード

public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    String responseStr = ""; 
    try 
    { 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(URL);   

     List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
     nameValuePairs.add(new BasicNameValuePair("action", "get_contact")); 
     nameValuePairs.add(new BasicNameValuePair("uId", uId + "")); 
     httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

     HttpResponse httpResponse = httpClient.execute(httpPost); 

     BufferedReader in = new BufferedReader (new InputStreamReader(httpResponse.getEntity().getContent())); 
     responseStr = in.readLine();   
     in.close(); 
    } 
    catch (ClientProtocolException e) 
    { 
     Log.e("EXCEPTION", "ClientProtocolException"); 
    } 
    catch (IOException e) 
    { 
     Log.e("EXCEPTION", "IOException"); 
    } 
    this.stopSelf(); 

    return Service.START_STICKY; 
} 

しかし、このコードの問題は、データをダウンロードするのに時間がかかりすぎるということです。このデータをダウンロードして自分のアクティビティにすばやく表示する方法を教えてください。

ご協力いただきありがとうございます。

答えて

0

あなたのサーバーや接続が遅い場合は、クライアントコードではあまりできません。

しかし、あなたは間違いなく、ヘッダーを追加し、Webサーバーからクライアントコードで応答を圧縮考慮する必要があります。

は受け入れ-エンコード:gzipで

0

あなたが遅い経験しないという保証はありませんHTTPレベルで圧縮を有効にしてもダウンロードまたはタイムアウトが発生します。終わりに無制限のデータセットを扱っており、開発環境で動作するものは非常に遅い接続で非常に長い名前で25000人の連絡先を持つ可能性があります。

実際にすべてのデータをすぐに読み込む必要があるかどうかを考慮して、一般的に問題を検討する価値があります。何らかの種類のページネゴシエーションを使用することができます(たとえば、this questionおよび/またはEndlessAdapterを使用してください)。

+0

お寄せいただきありがとうございます。試してみます。 –

0

代わりにソケット接続を使用してください。

0

私が気づく事は、あなたはバックグラウンドタスクとしてダウンロードしていないということです。サービスがメインアクティビティとは別のプロセスとして実行されている場合を除き、このコードはアプリケーションのメインアプリケーション(UI)スレッドで実行され、ユーザーに悪影響を及ぼします。コードをAsyncTaskまたはonStartCommandから起動されたスレッドに移動することをお勧めします。次に、サービスからのコールバックを利用して、データを表示することができることをアクティビティに通知します。また、ドミトリーが推奨するように、ページングは​​実際のダウンロード時間にも役立ちます。

関連する問題