在Android Activity中使用java.util.Timer中的计数器会导致应用程序崩溃

时间:2013-05-09 15:42:22

标签: java android timer android-imageview timertask

我想完成一些我认为简单的事情,但结果却很麻烦。

我有一个带有图片的加载屏幕,我希望它在应用程序加载时淡入淡出。我决定通过相对于计数器的正弦值频繁地改变它的不透明度来实现这一点。我的代码如下:

ImageView   loadingRaven;   //loading raven at the start of the app
Timer       timer;          //timer that we're gonna have to use
int         elapsed = 0;    //elapsed time so far

/*
 * the following is in the onCreate() method after the ContentView has been set
 */

loadingRaven = (ImageView)findViewById(R.id.imageView1);


//fade the raven in and out
TimerTask task = new TimerTask()
{
    public void run()
    {
        elapsed++;

        //this line causes the app to fail
        loadingRaven.setAlpha((float)(Math.sin(elapsed)+1)/2);
    }
};
timer = new Timer();
timer.scheduleAtFixedRate(task, 0, 50);

导致程序失败的问题是什么?我正确使用Timer和TimerTask吗?或者是否有更好的方法可以频繁更新图像的不透明度,以便顺畅地进出?

由于

1 个答案:

答案 0 :(得分:2)

TimerTask在不同的线程上运行。所以在主ui线程上更新ui。使用runonuithread

      TimerTask task = new TimerTask()
      {
        public void run()
         {
          elapsed++;
              runOnUiThread(new Runnable() //run on ui thread
                 {
                  public void run() 
                  { 


                     loadingRaven.setAlpha((float)(Math.sin(elapsed)+1)/2)
                 }
                 });

     }
  };

TimerTask在不同的线程上运行。您可以按照建议使用Handler和postDelayed pskink