2016-06-16 7 views
1

私は、TCPソケットを使用してサーバーに接続するアプリケーションをAndroidで開発しています。 私はAsynkTaskを使用してアプリケーションに接続しています。Android接続でAsyncTaskを使用してソケット接続を管理する必要がありますか?

アプリケーションは、ライフサイクル全体でサーバーから切断されません。アプリケーションがスリープ状態になっても、AsynkTaskは実行を継続し、ソケットは常に接続されます。ソケットは、サーバーがソケットを閉じたときにのみ切断され

(例外がthrowedとされているため、doInBackground()仕上げ)またはユーザー出口が(AsyncTaskがキャンセルされているため)アプリケーション

がこれは私のdoInBackground ()

@Override 
public Void doInBackground(Void ...pa){ 

     try {              
      sock = new Socket(InetAddress.getByName(serv), port);    
     } 
     catch(IOException ex) { errMessage = ex.getMessage() + "\n"; } 



    try { 
     if(sock != null) {     

      inStr = new DataInputStream(sock.getInputStream()); 
      outStr = new DataOutputStream(sock.getOutputStream()); 

      while(!isCancelled()) { 
       if(((hbDataSize = inStr.read()) & 0xC0) == 0xC0){ 
        lbDataSize = inStr.read(); 
        packetSize = (hbDataSize << 8 & 0x3F00) + lbDataSize; 
        buffer = new byte[packetSize-2]; 
        inStr.read(buffer, 0, packetSize-2); 
        publishProgress(0); 
       } 
      } 

     } else {    
      throw new IOException(errMessage); 
     } 
    }catch(IOException e) { // sin conexion salta a a excepcion 
     errMessage = e.getMessage(); 
     publishProgress(2); 
     isError = true; 
    } 
    return null; 
} 

とにかく方法を見ることができるようにコードを入力します。

私はAsyncTaskについて読んでいます。私は長い間AsyncTaskを使うべきだと言います。

AsyncTasksは、短い操作(最大でも数秒間)に理想的に使用する必要があります。スレッドを長時間実行し続ける必要がある場合は、javaが提供するさまざまなAPIを使用することを強くお勧めします。 Executor、ThreadPoolExecutor、FutureTaskなどのutil.concurrentパッケージ。

私のアプリはうまく動作しますが、私はExecutor、ThreadPoolExecutor、またはFutureTaskのAsyncTaskを変更する必要がありますか? もし私がそれを変更すべきだと思うなら、私はそれを変更すべきですか? 私はこれらの3つの塊について読んできましたが、私はそれを変えなければならないのです。

+0

使い方から見ると、それは束縛されたサービスのように見えますか? – SergeyA

+0

Future/Threadpool/Executorは、もっと長い/複雑なスレッディング/制限/タスク依存関係などを実行するタスクが多い/多くある場合に便利です。長期間にわたる_running_はf.e.を意味します。 Executor/Threadpool/Futureを使用して、実際に同時に動作するスレッドの数、実行順序、インライン実行などを制御することができます。 _Task_は、_calculate x_、_download file_などの有限の操作/ジョブです。 SergeyAが書いたように、あなたのケースは見えます。これは、(バインドされた)サービス、または単に実行し続ける別のスレッドのようです。 – makadev

+0

あなたの答えをありがとう、私は私の操作のためのサービスを使用します – mavi

答えて

4

あなたが説明したような継続的な仕事をしているなら、サービスを利用するのが最良です。アンドロイドはサービスでより良いリソースを管理します。アプリケーションがスリープ状態になっても(あなたはそのデバイスを意味しましたか?)サービスフレームワークまたはパッケージは、そのようなことを行うように設計されています。 AsyncTaskは、画像などのマイナーなダウンロード操作用です。しかし、クラウドサービスからの連続ストリームに依存する場合は、サービスを使用します。

関連する問題