0

這裏面的AsyncTaskArrayIndexOutOfBoundsException異常中的AsyncTask的onProgressUpdate 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

的lenght讓我們知道改變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

相關問題