2016-09-21 2 views
-1

La fonctionnalité de base de l'application est d'obtenir des données en temps réel à partir d'un fichier .csv présent sur un serveur FTP (Note: Le fichier .csv sur le serveur continue de mettre à jour simultanément) et afficher les valeurs .La dernière valeur ne semble pas être mise à jour. Seulement quand je ferme et rouvre l'application, je peux voir la dernière valeur affichée.

Je réussis à me connecter au serveur FTP et à analyser le fichier .csv pour afficher toutes les valeurs enregistrées sur le graphique. Mais, la dernière valeur ne semble pas être mise à jour sur le graphique. Seulement quand je ferme et rouvre l'application, je peux voir la dernière valeur affichée sur le graphique.

J'ai essayé le code suivant sans succès:

/* 
* Connects to a remote FTP server 
*/ 
void connectToFTP() { 

    try { 

     mFTPClient = new FTPClient(); 
     mFTPClient.connect(FTP_HOSTNAME, FTP_PORT); 
     returnCode = mFTPClient.getReplyCode(); 
     if (!FTPReply.isPositiveCompletion(returnCode)) { 
      throw new IOException("Could not connect"); 
     } 
     boolean loggedIn = mFTPClient.login(FTP_USER, FTP_PASSWORD); 
     if (!loggedIn) { 
      throw new IOException("Could not login"); 
     } 
     System.out.println("Connected and Logged in"); 
     statusUpdate.setText("Connected to FTP Server"); 
     mFTPClient.setFileType(FTP.BINARY_FILE_TYPE); 
     mFTPClient.enterLocalPassiveMode(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

void beginListenForData() throws IOException { 
    final Handler handler = new Handler(); 
    final byte delimiter = 10; //This is the ASCII code for a newline character 


    stopWorker = false; 
    readBufferPosition = 0; 
    readBuffer = new byte[1024]; 
    mmInputStream = mFTPClient.retrieveFileStream(fileName); 

    workerThread = new Thread(new Runnable() { 
     public void run() { 
      while (!Thread.currentThread().isInterrupted() && !stopWorker) { 
       try { 
        Log.i("Inside begindata ", "data " + count++); 
        int bytesAvailable = mmInputStream.available(); 
        if (bytesAvailable > 0) { 
         byte[] packetBytes = new byte[bytesAvailable]; 
         mmInputStream.read(packetBytes); 
         for (int i = 0; i < bytesAvailable; i++) { 
          byte b = packetBytes[i]; 
          if (b == delimiter) { 
           byte[] encodedBytes = new byte[readBufferPosition]; 
           System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length); 
           final String data = new String(encodedBytes, "US-ASCII"); 
           readBufferPosition = 0; 

           handler.post(new Runnable() { 
            public void run() { 
             myLabel.setText(data); 

             String s = data; 
             String[] values = data.split(","); 
             Log.i("Text ", "data " + values[3]); 
             datalist.add(values[3]); 
             power.setText(values[3]); 



            } 
           }); 
          } else { 
           readBuffer[readBufferPosition++] = b; 
          } 
         } 
         // dataPoints(); 
        } 
       } catch (IOException ex) { 
        stopWorker = true; 
       } 
      } 
     } 
    }); 

    workerThread.start(); 
} 
+1

stockez vos valeurs analysées dans la base de données SQLite et actualisez les données à l'aide des fournisseurs de contenu. –

+0

Je suis nouveau sur Android et SQLite. Pouvez-vous s'il vous plaît montrer un exemple? –

Répondre

0

Utilisez la tâche Async pour télécharger les données du serveur et mettre à jour l'interface utilisateur dans la méthode onPostExecute.

démarrer cette tâche asynchrone à partir de la méthode d'activité "onCreate".

+0

Je suis nouveau sur Android. Pouvez-vous s'il vous plaît montrer avec un exemple? –