利用线程池执行动画轮播
时间: 2023-07-06 09:35:02 浏览: 69
动画轮播是一个常见的UI交互效果,它通常需要在主线程中更新UI,并且需要定时执行。为了避免在主线程中执行耗时操作,可以利用线程池来执行动画轮播任务。下面是一个简单的示例代码:
```java
public class MainActivity extends AppCompatActivity {
private ViewPager mViewPager;
private int[] mImageIds = {R.drawable.img1, R.drawable.img2, R.drawable.img3};
private int mCurrentItem = 0;
private ScheduledExecutorService mScheduledExecutorService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager = findViewById(R.id.view_pager);
mViewPager.setAdapter(new MyPagerAdapter());
}
@Override
protected void onStart() {
super.onStart();
mScheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
mScheduledExecutorService.scheduleWithFixedDelay(new ViewPagerTask(), 2, 2, TimeUnit.SECONDS);
}
@Override
protected void onStop() {
super.onStop();
if (mScheduledExecutorService != null) {
mScheduledExecutorService.shutdown();
mScheduledExecutorService = null;
}
}
private class MyPagerAdapter extends PagerAdapter {
@Override
public int getCount() {
return mImageIds.length;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
ImageView imageView = new ImageView(MainActivity.this);
imageView.setImageResource(mImageIds[position]);
container.addView(imageView);
return imageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
private class ViewPagerTask implements Runnable {
@Override
public void run() {
mCurrentItem = (mCurrentItem + 1) % mImageIds.length;
mViewPager.post(new Runnable() {
@Override
public void run() {
mViewPager.setCurrentItem(mCurrentItem);
}
});
}
}
}
```
在这个示例中,我们使用了一个线程池来执行ViewPagerTask任务,它会每隔2秒更新ViewPager控件的显示页面。在Activity的onStart()方法中,我们创建了一个单线程的ScheduledExecutorService实例,并通过scheduleWithFixedDelay()方法周期性地执行ViewPagerTask任务。在Activity的onStop()方法中,我们停止了之前启动的定时任务,并释放相关资源。
注意,在ViewPagerTask任务中,我们使用了ViewPager的post()方法将更新UI的操作放到主线程中执行,以避免在子线程中更新UI。这是因为Android的UI操作必须在主线程中执行,否则会抛出异常。