2012-04-19 5 views
2

J'ai le code suivant pour exécuter une connexion socket client dans un AsyncTask:Android AsyncTask publishProgress ne remet pas onProgressUpdate

@Override 
protected Boolean doInBackground(Void... params) { //This runs on a different thread 
    boolean result = false; 
    try { 
     Log.i("AsyncTask", "doInBackground: Creating socket"); 
     SocketAddress sockaddr = new InetSocketAddress("192.168.1.115", 9090); 
     nsocket = new Socket(); 
     nsocket.connect(sockaddr, 5000); //10 second connection timeout 
     if (nsocket.isConnected()) { 
      nis = nsocket.getInputStream(); 
      wr = new BufferedWriter(new OutputStreamWriter(nsocket.getOutputStream())); 
      Log.i("AsyncTask", "doInBackground: Socket created, streams assigned"); 
      Log.i("AsyncTask", "doInBackground: Waiting for inital data..."); 
      sockState = true; 
      byte[] buffer = new byte[4096]; 
      int read = nis.read(buffer, 0, 4096); //This is blocking 
      while(read != -1){ 
       byte[] tempdata = new byte[read]; 
       System.arraycopy(buffer, 0, tempdata, 0, read); 
       publishProgress(tempdata); 
       Log.i("AsyncTask", "doInBackground: Got some data"); 
       read = nis.read(buffer, 0, 4096); //This is blocking 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.i("AsyncTask", "doInBackground: IOException"); 
     result = true; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     Log.i("AsyncTask", "doInBackground: Exception"); 
     result = true; 
    } finally { 
     try { 
      nis.close(); 
      wr.close(); 
      nsocket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     Log.i("AsyncTask", "doInBackground: Finished"); 
    } 
    return result; 
} 

@Override 
protected void onProgressUpdate(byte[]... values) { 
    Log.d("KMC.NetworkTask", String.valueOf(values[0])); 
    if (values.length > 0) { 
     Log.d("KMC.NetworkTask", "onProgressUpdate: " + values[0].length + " bytes received."); 
     result = new String(values[0]); 
    } 
} 

la prise fonctionne. Cependant, onProgressUpdate n'est pas appelé, même si la tâche d'arrière-plan me dit que les données sont entrées.

Quelqu'un at-il des pointeurs pour moi ?? Je n'ai rien trouvé sur google: |

+0

Quelle quantité de données que vous lisez? Si ce n'est pas le cas, le thread d'arrière-plan se termine peut-être avant la première mise à jour des progrès. –

+0

seulement quelques octets ... parfois seulement "vrai" est envoyé .. btw le fil d'arrière-plan est une boucle, le socket reste ouvert et la tâche ne se termine pas –

Répondre

0

Pour l'instant je l'ai résolu comme ceci:

@Override 
protected Boolean doInBackground(Void... params) { //This runs on a different thread 
    try { 
     Log.i("AsyncTask", "doInBackground: Creating socket"); 
     SocketAddress sockaddr = new InetSocketAddress("192.168.1.115", 9090); 
     nsocket = new Socket(); 
     nsocket.connect(sockaddr, 5000); //10 second connection timeout 
     if (nsocket.isConnected()) { 

      in = new BufferedReader(new InputStreamReader(nsocket.getInputStream())); 
      wr = new BufferedWriter(new OutputStreamWriter(nsocket.getOutputStream())); 
      Log.i("AsyncTask", "doInBackground: Socket created, streams assigned"); 
      sockState = true; 

      String inputLine = ""; 
      while ((inputLine = in.readLine()) != null) { 
       result = inputLine; 
       Log.d("AsyncTask", "doInBackground: Got some data:" + inputLine); 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.i("AsyncTask", "doInBackground: IOException"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     Log.i("AsyncTask", "doInBackground: Exception"); 
    } finally { 
     try { 
      nis.close(); 
      wr.close(); 
      nsocket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     Log.i("AsyncTask", "doInBackground: Finished"); 
    } 
    return true; 
} 

public String getResult(){ 
    String r = result; 
    result = null; 
    return r; 
} 

le thread principal attend le résultat, et récupère ensuite le résultat avec getResult():

while(null == networktask.result){} 
Log.d("KMC.onCreate", networktask.getResult()); 
0

valeurs est une table, donc quand vous écrivez des valeurs [0] vous obtenez le tableau d'octets, donc je pense que vous devez faire quelque chose comme ça: String.valueOf(values[0][0])

+0

je vais ty quand je rentre à la maison –

+0

je l'ai essayé: Sans succès. J'ai également essayé d'utiliser une chaîne comme type de mise à jour, sans succès. C'est comme si la méthode n'était pas appelée. –

0

J'ai eu un problème similaire parce que je ha d implémenté un constructeur pour ma sous-classe AsyncTask et n'appelait pas super() dedans.

public class TNailTask extends AsyncTask<File, Integer, HashMap<Integer, BitmapDrawable>> { 

private DirListingAdapter dir_listing; 
private Context context; 

public TNailTask(DirListingAdapter dir_listing, Context context) { 
    super(); // call super to make sure onProgressUpdate works 
    this.dir_listing = dir_listing; 
    this.context = context; 
} 

protected HashMap<Integer, BitmapDrawable> doInBackground(File... image_files) { 
    .... 
} 

protected void onProgressUpdate(Integer... progress) { 
    .... 
} 

}

Questions connexes