2017-08-12 5 views
0

J'ai une application qui lit à partir d'une socket. J'ai testé cela sur un téléphone avec API 18 sur. Si je l'essaie sur un téléphone avec API 24, il y a une exception NetworkOnMainThread. J'ai lu que j'ai besoin de faire cela dans AsyncTask pour l'API plus tard, ou je fais quelque chose d'autre faux. Je ne suis pas sûr de ce que je dois faire avec mon code pour le convertir en un AsyncTask pour la façon dont j'attends les données de flux d'entrée?Passage de la tâche exécutable à la tâche asynchrone

Ceci est ma classe de flux d'entrée en lecture.

class receiveData extends Thread { 

    private volatile boolean exit = false; 
    DataInputStream in; 
    byte[] fullBuffer = new byte[7]; 
    byte[] buffer = new byte[100]; 
    int bytes; // bytes returned from read() 
    int bytesCount = 0; 

    public void run(){ 
     try { 
      if (socket.isConnected()) { 
       in = new DataInputStream(socket.getInputStream()); 
      } 
     } catch(Exception e) { 
      Log.d(TAG, "in receiveData - run exception - " + e.toString()); 
     } 
     while(!exit) { 
      try { 
       bytes = in.read(buffer); 
       System.arraycopy(buffer, 0, fullBuffer, bytesCount, bytes); 
       bytesCount = bytesCount + bytes; 
       if (bytesCount >= 7) { 
        h.obtainMessage(NOW_DATA_RECEIVED, bytesCount, -1, fullBuffer).sendToTarget();  // Send to message queue Handler 
        bytesCount = 0; 
       } else { 
        Log.d(TAG, "Receive Error"); 
        bytesCount = 0; 
       } 
      } catch(Exception e) { 
       Log.d(TAG, "Read Error - " + e.toString()); 
      } 
     } 
    } 

    public void stopRdThread() { 
     exit = true; 
     try { 
      socket.close(); 
     } catch(Exception e) { 
      Log.d(TAG, "error closing socket - " + e.toString()); 
     } 
    } 

    /* Call this from the main activity to send data to the remote device */ 
    public void write(byte[] message) { 
     try { 
      DataOutputStream out = new DataOutputStream(socket.getOutputStream()); 
      out.write(message); 
      out.flush(); 
     } catch (IOException e) { 
      Log.d(TAG, "...Error data send: " + e.getMessage() + "..."); 
     } 
    } 
} 

Je commence comme ça.

private receiveData rd; 

// start receiver thread 
rd = new receiveData(); 
rd.start(); 

Comme je l'ai dit qu'il travaille beaucoup dans l'API 18 mais pas dans l'API 24. Tous les exemples que j'ai vu sont pour une large des tâches en arrière-plan, telles que le téléchargement d'une image, pas des fils qui sont gauche en cours d'exécution en attente de données.

+0

Sur quelle ligne rencontrez-vous l'erreur? J'utilise 'public void run()' souvent (même pour API 24) sans problèmes. Est-ce un simulateur ou un téléphone spécifique? – Barns

Répondre

0

Bien toutes les API androïdes les plus récentes jetteront des exceptions lorsque vous essayerez de connecter le réseau dans le thread ui. La seule façon est d'utiliser AsyncTask ou d'utiliser Handler;

final Handler handler = new Handler(); 
handler.post(new Runnable() { 
    @Override 
    public void run() { 
    //Do something 
    } 
}); 

Note: Si vous voulez utiliser le réseau puis afficher des choses sur l'interface utilisateur, vous devez utiliser AsyncTask.