每次运行后定时器都会加速

时间:2013-08-06 15:43:47

标签: java android timer

我正在为Android制作一个简单的图像查看器。我也需要实现幻灯片演示。我已经完成了,除了我有一个烦人的bug。当我运行幻灯片时(按下按钮)它可以工作。但是当我取消幻灯片并再次运行(同一个按钮)时,幻灯片显示速度加快。

编辑:添加了固定代码,查看代码幻灯片部分中的注释,看看需要修复的内容

   package csc2002.imageviewer;
   //imports

public class MainActivity extends Activity implements OnClickListener {
    static Timer timer = new Timer();
    int arrayIndex = 0;
    int checker=0;
    int start,delay = 1800;
    boolean toggle;


    private static Integer[] imageIds = { //Hard coded array
        R.raw.bulbasaur,R.raw.switch_brain,R.raw.quote,R.raw.victory,R.raw.penguins,R.raw.jellyfish,R.raw.koala};

    private static final int IMAGE_COUNT = imageIds.length;

    @Override
    public void onCreate(Bundle savedInstanceState) { // Called when the app is opened

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button back = (Button)findViewById(R.id.backButton);
        back.setOnClickListener(this);       
        Button next = (Button)findViewById(R.id.nextButton);
        next.setOnClickListener(this);
        Button slideshow = (Button)findViewById(R.id.slideButton);
        slideshow.setOnClickListener(this);
        displayImage();
    }

    // responsible for displaying the image and the name of the image.
    private void displayImage() { // Displays the image on the screen according the the current array index

        ImageView imgView = (ImageView) findViewById(R.id.myimage);             
        imgView.setImageResource(imageIds[arrayIndex]);
        TextView text = (TextView)findViewById(R.id.name);
        text.setText(imageIds[arrayIndex]);
    }

    // This method allows the cycling of images

    public void onClick(View v) {
        if(v.getId()==(R.id.backButton)){ //Back button
            arrayIndex--;

            if(arrayIndex==-1){
                arrayIndex = IMAGE_COUNT-1;
            }
            displayImage();
        }

        else if (v.getId()==(R.id.nextButton)){ //NextButton
            arrayIndex++;
        }
        if(arrayIndex==IMAGE_COUNT){
            arrayIndex = 0;
        }
        displayImage();

        if (v.getId()==R.id.slideButton){ //Slideshow button
            Button slideshow = (Button)findViewById(R.id.slideButton);
            toggle^= true;
            if(toggle==true){
                slideshow.setText("Stop Slideshow");
            }
            else{slideshow.setText("Start Slideshow");}
        }
        // Slideshow functionality

        if(toggle==true){
            //timer=new Timer(); //this was added in the correct solution(This was the main problem).
            timer.scheduleAtFixedRate(new TimerTask() {

                @Override
                public void run() {
                    if(toggle==true){
                        MainActivity.this.runOnUiThread(new Runnable() {
                            public void run() {
                                arrayIndex++;
                                if(arrayIndex==IMAGE_COUNT){
                                    arrayIndex=0;
                                }

                                displayImage();
                            }
                        });
                    }  
                }

            },start,delay);

        }
        else if(toggle==false){
            //timer.cancel(); This was added to correct the solution
        }
    }

    @Override 
    protected void onSaveInstanceState(Bundle outState) { //This saves data when the app is rotated
        outState.putInt("KEY", arrayIndex);
        super.onSaveInstanceState(outState);

    }
    @Override
    protected void onRestoreInstanceState(Bundle save){ //Restores Data after interruption
        super.onRestoreInstanceState(save);
        arrayIndex = save.getInt("KEY");
        displayImage();
    }


}

1 个答案:

答案 0 :(得分:1)

我在几年前做过的项目遇到了类似的问题。当然,我使用的是Timer对象,但这里有几件我要解决的问题:

  • 确保明确停止计时器。
  • 重新初始化计时器,覆盖原始计时器。

如果这些建议不起作用,请尝试发布更多代码。

修改

public void onClick(View v) {
    //...
    if (v.getId()==R.id.slideButton){ //Slideshow button
        toggle^= true;
        if(toggle==true){
            timer = new Timer();
            timer.schedule(/*Whatever TimerTask you had here before*/);         
        }
        else{
            timer.cancel();
        }
    }//end if(slide button)
}//end onClick()

通过这种方式,只有在单击切换按钮时才启动或结束计时器。单击按钮时会创建计时器,再次单击时会取消计时器。永远不应该有两个活跃的计时器。我不太确定它能够很好地适应你现在的代码,但它应该与你第一次使用的代码一起使用。