当前位置: 代码迷 >> Android >> Timer().schedule ,报ArrayIndexOutOfBoundsException,该如何解决
  详细解决方案

Timer().schedule ,报ArrayIndexOutOfBoundsException,该如何解决

热度:229   发布时间:2016-05-01 22:15:16.0
Timer().schedule ,报ArrayIndexOutOfBoundsException
当触发间隔为200毫秒或大于200毫秒时,是不会报错的,但是如果小一点,比如100,就有可能报错。。。
郁闷啊。。。是不是线程的问题,求解。
Java code
public class Crazy02_layoutActivity extends Activity {    /** Called when the activity is first created. */    private int[]colors={R.color.color7,            R.color.color6,            R.color.color5,            R.color.color4,            R.color.color3,            R.color.color2,            R.color.color1    };    private int[]names={R.id.view1,            R.id.view2,            R.id.view3,            R.id.view4,            R.id.view5,            R.id.view6,            R.id.view7};    private TextView[]views=new TextView[7];    private int currentColor=0;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        for(int i=0;i<names.length;i++)        {            views[i]=(TextView)findViewById(names[i]);        }        final Handler handler=new Handler(){            @Override            public void handleMessage(Message msg) {                // TODO Auto-generated method stub                if(msg.what==0x2211)                {                    for(int i=0;i<colors.length-currentColor;i++)                    {                        System.out.println("i="+i+",currentColor+i="+(currentColor+i));                        views[i].setBackgroundResource(colors[currentColor+i]);                                            }                    System.out.println("first end......");                    for(int i=0,j=colors.length-currentColor;i<currentColor;i++,j++)                    {                        System.out.println("j="+j+",i="+i);                        views[j].setBackgroundResource(colors[i]);                    }                    System.out.println("second end........");                }                super.handleMessage(msg);            }                    };        new Timer().schedule(new TimerTask() {                        @Override            public void run() {                // TOsdfAuto-generated method stub                currentColor++;                if(currentColor==7)                    currentColor=0;                Message msg=new Message();                msg.what=0x2211;                handler.sendMessage(msg);            }        },0,140);    }}



------解决方案--------------------
Java code
               currentColor++;if(currentColor==7)   currentColor=0;
------解决方案--------------------
在多线程下,有可能①的时候currentColor是6,到③就变成7了,那样就数组越界了.
应该是异步操作的吧,
------解决方案--------------------
楼上看来把能说的都说了。
if( condition ){ operations }

condition和operations 中间可能被两个不同的线程插进去,结果么你懂的。
------解决方案--------------------
主线程和Timer线程共享currentColor变量,不加锁控制,不出问题才怪.
  相关解决方案