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

相关问题