0

Hier ist der Code innerhalb AsyncTaskArrayIndexOutOfBoundsException in onProgressUpdate von AsyncTask in Android

doInBackground(Void… params){ 
    for(int i=0;i<5;++i){ 
     if(i==4){ 
      threeParams = true; 
      publishProgress(i+1,i+2,i+3); 
      try{ 
       Thread.sleep(2000); 
      }catch(Exception e){} 

     }else{ 
      publishProgress(i+1,i+2); 
      try{ 
      Thread.sleep(2000); 
      }catch(Exception e){} 
     } 

} 

onProgressUpdate(Integer… params){ 
    if(threeParams){ 
     tv.setText(params[0] + “,” + params[1] + “,” + params[2]); 
     threeParams = false; 
    }else{ 
     tv.setText(params[0] + “,” + params[1]); 
    } 
} 

Wenn i = 4, onProgressUpdate, ich soll 5,6,7 bekommen, aber es stürzt mit ArrayIndexOutOfBoundsException. Ich habe keine Ahnung, was ich falsch mache.

+0

Was haben Sie in params? – Shaishav

+0

Lesen Sie einfach diese Ausnahme Nachricht (und für die Zukunft: Vergangenheit mit Ihren Fragen!) --- es genau sagt Ihnen, was Ihr Problem ist: Sie wollen einige Index M zugreifen ... aber Ihr Array hat Länge N; mit M> N. Es ist immer eine schlechte Idee, ** anzunehmen, dass ein Array eine bestimmte Größe hat; ohne das zu überprüfen! – GhostCat

+0

@GhostCat aber ich übergebe 3 Parameter an die Funktion. Also muss ich auch 3 Parameter erhalten, oder? Wenn wir das nicht annehmen können, dann stellen wir die Glaubwürdigkeit von Java selbst in Frage! – Nikhil

Antwort

0

Vielleicht Fehler passiert, weil Ihr threeParams globale Variable sind die Überprüfung der Länge von params

Lassen Sie uns das Ergebnis nach Veränderung kennen, um zu bestimmen onProgressUpdate() wie folgt:

public void onProgressUpdate(Integer... params){ 
    if(params.length == 3){ 
     tv.setText(params[0] + "," + params[1] + "," + params[2]); 
    }else if (params.length == 2){ 
     tv.setText(params[0] + "," + params[1]); 
    } 
} 

Dieser Code ist zuverlässiger, da Sie überprüfen die eigene Arraylänge vor der Verwendung (und nicht eine Variable, die an einer anderen Stelle gesetzt und geändert wurde).

UPDATE

Dieses einfache Test-Projekt arbeitet völlig in Ordnung:

AsyncTask

public class Assync extends AsyncTask<Integer, Integer, Integer> { 
    Context context; 

    public Assync(Context cont) { 
     context = cont; 
    } 

    @Override 
    protected Integer doInBackground(Integer... voids) { 
     for(int i=0;i<5;++i){ 
      if(i==4){ 
       publishProgress(i+1,i+2,i+3); 
       try{ 
        Thread.sleep(2000); 
       }catch(Exception e){} 

      }else{ 
       publishProgress(i+1,i+2); 
       try{ 
        Thread.sleep(2000); 
       }catch(Exception e){} 
      } 
     } 
     return 0; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... params) { 
     if(params.length == 3){ 
      //tv.setText(params[0] + "," + params[1] + "," + params[2]); 
      Toast.makeText(context, "3 - " + params[0] + "," + params[1] + "," + params[2], Toast.LENGTH_LONG).show(); 
     }else if (params.length == 2){ 
      //tv.setText(params[0] + "," + params[1]); 
      Toast.makeText(context, "2 - " + params[0] + "," + params[1], Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

Aktivität

Assync task = new Assync(this); 
task.execute(0); 
+0

ThreeParams ist keine globale Variable. Es ist in der AsyncTask-Klasse definiert. Durch die Verwendung des obigen Codes wird nicht auf den ersten Blick auf alles eingegangen. Obwohl ich 3 Parameter passiere. – Nikhil

+0

Teilen ganzen Code oder ganzes Protokoll .. Sie können einige Protokollnachrichten auch zum Testen einfügen ... Ich teste Ihren Code + meine Reparatur und es funktioniert gut ... – W0rmH0le