2016-06-02 8 views
0

Mit einer weiteren Frage, hier komme ich. Unter Verwendung einer Aufgabe Async wie folgt:Android - AsyncTask onProgressUpdate aufgerufen, aber nicht "wie erwartet"?

private class ProcessFileTask extends AsyncTask<Void, byte[], Void>{ 
     String fileName; 
     BufferedReader bufferedReader; 
     String[] splitData; 
     byte[] currentArray; 
     ByteBuffer bb; 

     public ProcessFileTask(String fileName) { 
      this.fileName = fileName; 
      currentArray = new byte[19]; 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       bufferedReader = new BufferedReader(new FileReader(fileName)); 
       splitData = bufferedReader.readLine().split(" "); 
       for (int i = 0; i < splitData.length; i += 19) { 
        for (int j = 0; j < 19; j++) { 
         currentArray[j] = Byte.parseByte(splitData[i+j]); 

        } 
        publishProgress(currentArray); 
       } 

      } 
      catch (Exception e){ 
       Log.e("Exception occured", e.toString()); 
      } 
      return null; 
     } 



     @Override 
     protected void onProgressUpdate(byte[]... values) { 
      super.onProgressUpdate(values); 
      bb = ByteBuffer.allocate(20); 
      bb.order(ByteOrder.LITTLE_ENDIAN); 
      bb.put(values[0], 1, 18); 
      ChannelOne.updateGraph(bb.getShort(0), bb.getShort(2), bb.getShort(4)); 
      ChannelTwo.updateGraph(bb.getShort(12), bb.getShort(14), bb.getShort(16)); 

     } 
    } 

An diesem Teil der Ausführung:

for (int i = 0; i < splitData.length; i += 19) { 
    for (int j = 0; j < 19; j++) { 
     currentArray[j] = Byte.parseByte(splitData[i+j]); 
    } 
    publishProgress(currentArray); 
} 

erwarte ich, dass die publishProgress jedes Mal das 'i' genannt werden Schleife ausführt. Während dies geschieht (was durch Logging-Daten verifiziert wurde), wird der Code in onProgressUpdate() nicht richtig ausgeführt (was offensichtlich ist, weil das Ergebnis von updateGraph erst nach dem Ende der AsyncTask sichtbar ist. Auch das Endgraph ist völlig falsch. gebildet (das Diagramm zeigt meist gerade Linien, während es Kurven sein müssen.)

Dieses seltsame Problem tritt nicht auf, wenn der gesamte Code direkt auf UI Thread ausgeführt wird und das Diagramm perfekt gerendert wird. In diesem Fall, wie Sie wissen , wird die UI für einige Sekunden blockiert.

ich habe versucht, statt AsyncTask den Code als ein einzelner Thread läuft, aber die gleichen Ergebnisse bestehen. Es können beliebige Abhilfen gemacht werden? kann ein Service in diesem Fall verwendet werden?

+0

http://stackoverflow.com/a/18944439/793943 überprüfen auf dieser – Sush

+0

@sush Die OP gibt die onProgressUpdate sagte() wurde nie aufgerufen und ging weiter, um sein eigenes Problem zu lösen, indem er "@Override" verwendete. Mein Problem ist jedoch anders. Hier wird onProgressUpdate() aufgerufen, aber die UI-Aktualisierungen werden nicht ordnungsgemäß durchgeführt. – Sriram

+0

Es hat auch ur ans. Lesen - Das Timing der Ausführung ist nicht definiert. Diese Methode wird verwendet, um jede Art von Fortschritt in der Benutzerschnittstelle anzuzeigen, während die Hintergrundberechnung noch ausgeführt wird. Zum Beispiel kann damit eine Fortschrittsleiste animiert oder Protokolle in einem Textfeld angezeigt werden. – Sush

Antwort

0

Versuchen nach "super.onProgressUpdate (Werte)," Entfernen aus dem Code

@Override 
    protected void onProgressUpdate(byte[]... values) { 
     bb = ByteBuffer.allocate(20); 
     bb.order(ByteOrder.LITTLE_ENDIAN); 
     bb.put(values[0], 1, 18); 
     ChannelOne.updateGraph(bb.getShort(0), bb.getShort(2), bb.getShort(4)); 
     ChannelTwo.updateGraph(bb.getShort(12), bb.getShort(14), bb.getShort(16)); 

    } 
+0

Nein, leider hat das nicht funktioniert und die Ergebnisse sind die gleichen wie zuvor :( – Sriram

Verwandte Themen