0

Вот код внутри AsyncTaskArrayIndexOutOfBoundsException в onProgressUpdate из AsyncTask в 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]); 
    } 
} 

Когда я = 4, onProgressUpdate, я должен получить 5,6,7, но он падает с ArrayIndexOutOfBoundsException. Я понятия не имею, что я делаю неправильно.

+0

Что вы предоставите в Params? – Shaishav

+0

Просто прочитайте это сообщение об исключении (и для будущего: пропустите его с вашими вопросами!) --- он сообщает вам, в чем именно заключается ваша проблема: вы хотите получить доступ к некоторому индексу M ... но ваш массив имеет длину N; с M> N. Всегда есть плохая идея просто ** предположить **, что массив имеет определенный размер; не проверяя это! – GhostCat

+0

@GhostCat, но я передаю 3 параметра функции. Значит, я должен правильно получить 3 параметра? Если мы не можем предположить, что тогда мы ставим под сомнение достоверность самой java! – Nikhil

ответ

0

Может быть, ошибка происходит потому, что ваш проверяют глобальную переменную threeParams, чтобы определить длину от params

Дайте нам знать результат после изменения onProgressUpdate() следующим образом:

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]); 
    } 
} 

Этот код является более надежным, так как вы проверяете собственную длину массива перед использованием (а не переменную, которая была установлена ​​и изменена в другом месте).

UPDATE

Этот простой тест работает проект совершенно нормально:

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(); 
     } 
    } 
} 

активность

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

threeParams не является глобальной переменной. Он определен внутри класса AsyncTask. Используя вышеприведенный код, он не входит в первый взгляд. Хотя я прохожу 3 параметра. – Nikhil

+0

Доля всего кода или всего журнала .. вы можете вставить некоторые сообщения журнала, а также проверить ... Я тестирую ваш код + мое исправление, и он отлично работает ... – W0rmH0le

Смежные вопросы