2016-11-03 8 views
0

Welcher ist der beste Weg, um Daten aus AsyncTask zu extrahieren? Gibt es eine bessere Möglichkeit, Daten im Hintergrund zu verwalten?Aufwand zum Extrahieren von Daten aus AsyncTask

Bisher ist dies die Funktion Ich bin mit Socket-Kommunikation zu machen und ändern Nachrichten:

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; 
    } 
} 

Wie ich es schnell sehen kann, zu verarbeiten, aber wie kann ich es schaffe „Antwort“ zu extrahieren daraus Code mit onPostExecute?

+1

Mögliches Duplikat von [Wie bekomme ich das Ergebnis von OnPostExecute() zur Hauptaktivität, weil AsyncTask eine separate Klasse ist?] (Http://stackoverflow.com/questions/12575068/how-to-get-the-result- of-onpostexecute-to-main-activity-as-asynctask-is-a) –

+0

Zuerst müssen Sie etwas aus 'doInBackground' zurückgeben, damit der' onPostExecute' davon weiß. Alternativ gibt es wahrscheinlich Bibliotheken, die Socket-Kommunikation einfacher machen ohne AsyncTask –

+0

Ein [diese Antwort] (http://stackoverflow.com/a/38004234/2308683) beschreibt, dass AsyncTask für eine Socket-Operation überhaupt nicht ideal ist . –

Antwort

0

Wenn ich Sie richtig verstehe: Es gibt irgendwo eine Business Class, die über die erhaltene Antwort informiert werden möchte.

Also Ihre asynchrone Aufgabe muss diese andere Klasse in irgendeiner Weise benachrichtigen, was in der OnPostExecute-Methode geschehen könnte (es sei denn, die verwendete AsyncTask bietet sich selbst als Mechanismus an). Wenn Sie es selbst implementieren müssen: Es gibt viele verschiedene Möglichkeiten, vom einfachen Object wait/notify, über komplizierter mit CompleableFuture, oder einfach (in Ihre Task-Klasse) eine Schnittstelle mit einer Callback-Methode übergeben.

Sobald Ihre Business-Klasse benachrichtigt wurde, könnte es z. Greifen Sie auf die Antwort mit einem einfachen Getter zu (den Sie noch implementieren müssen).

Verwandte Themen