2016-11-03 6 views
0

AsyncTaskからデータを抽出する最良の方法はどれですか?バックグラウンドでデータを管理する良い方法はありますか?AsyncTaskからデータを抽出しようとする

これまでのところ、これは私がソケット通信を行い、メッセージを変更するために使用している機能である:私はそれを処理するための高速で見ることができますが、私はこのことから、「応答」を抽出するために管理する方法として

public class MyClientTask extends AsyncTask<Void, Void, Void> { 
    String dstAddress; 
    int dstPort; 
    String response = ""; 

    MyClientTask(String endereco, int porta) { 
     dstAddress = endereco; 
     dstPort = porta; 
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 
     try { 
      socket = new Socket(dstAddress, dstPort); 
      socketStatus = true; 

      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1024); 
      byte[] buffer = new byte[1024]; 
      int bytesRead; 
      InputStream inputStream = socket.getInputStream(); 
      /* 
      * notice: 
      * inputStream.read() will block if no data return 
      */ 
      response = ""; 
      while ((bytesRead = inputStream.read(buffer)) != -1) { 
       byteArrayOutputStream.write(buffer, 0, bytesRead); 
       response = byteArrayOutputStream.toString("UTF-8"); 
      } 
     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      response = "UnknownHostException: " + e.toString(); 
      socketStatus = false; 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      response = "IOException: " + e.toString(); 
     } finally { 
      if (socket != null) { 
       try { 
        socket.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } 
     return null; 
    } 
} 

onPostExecuteを使用してコードですか?

+1

[AsyncTaskが別のクラスであるため、OnPostExecute()の結果をメインアクティビティに取得する方法](http://stackoverflow.com/questions/12575068/how-to-get-the-result- Asynctask-is-a) –

+0

最初に、 'onPostExecute'がそれを知るように' doInBackground'から何かを実際に返す必要があります。代わりに、AsyncTaskなしでソケット通信を簡単にするライブラリがあるかもしれません。 –

+0

[この回答](http://stackoverflow.com/a/38004234/2308683)では、ソケット操作のための 'AsyncTask'は、おそらく理想的ではないと説明しています。 –

答えて

0

私が正しく理解している場合:受け取った返答について知らせたいビジネスクラスがあります。

したがって、非同期タスクは、(使用されたAsyncTask自体がそのようなメカニズムを提供しない限り)OnPostExecuteメソッドで行うことができる何らかの方法でこの他のクラスに通知する必要があります。あなた自身でそれを実装しなければならない場合:単純なObjectのwait/notifyから、CompletableFutureを使用するより洗練されたものまで、またはコールバックメソッドを持つインターフェイスを(タスククラスに)渡すだけで、さまざまな可能性があります。

ビジネスクラスに通知があったら、たとえば、単純なゲッターで応答にアクセスします(まだ実装する必要があります)。

関連する問題