基于优先级队列写的一个SmartQueue(可控制多个线程的顺序执行、View的顺序显示):Android-SmartQueue

jopen 9年前
基于优先级队列写的一个SmartQueue(可控制多个线程的顺序执行、View的顺序显示),利用它可以轻松实现RecyclerView、ListView等Item的进入动画,网络请求线程的顺序执行。

效果:

Usage

多个线程顺序执行

你可以创建一个ThreadPriorityQueue对象,然后通过.run()方法让线程开始执行,创建ThreadPriorityQueue对象的时候,你可以通过addThread()方法添加线程,其中第一个参数是Thread对象,第二个参数是你自己设置线程的优先级(值范围是1~10,优先级越高线程越先执行,当设置的值不在这个范围则默认为1):

ThreadPriorityQueue mThreadPriorityQueue = new ThreadPriorityQueue.QueueBuilder()                          .addThread(thread1, 10).addThread(thread2, 9)                          .addThread(thread3, 8).addThread(thread4, 7)                          .addThread(thread5, 6).addThread(thread6, 5)                          .create();  mThreadPriorityQueue.run();

当你想停止线程的执行,你可以调用:

if(mThreadPriorityQueue!=null){        mThreadPriorityQueue.removeAll();//停止后续Thread任务 }

多个View的顺序显示

你可以添加任何的View,来控制它们的显示顺序,正如上面的效果一样,你可以控制Activity中布局的显示顺序,也可以控制列表项的显示,通过控制View的显示顺序你让界面不同的动画效果,如:

ViewPriorityQueue viewPriorityQueue = new ViewPriorityQueue.ViewBuilder(this,null).addView(views.get(3)).addView(views.get(5)).addView(views.get(4)).create();          //View的执行顺序是按addView()的顺序,越前表示越先显示  viewPriorityQueue.run();

其中和第一种方式一样先创建一个ViewPriorityQueue对象,其中ViewBuilder()中有两个参数,第一个是当前的Activity对象,第二个是实现一个ViewAnim接口(为null表示View的显示是默认的效果,或者自己实现这个接口自定义View的显示动画效果),这个addView()方法表示添加View,越先添加的View越先显示,所以你想让某个View最先显示你可以把它第一个添加。如下就是我自定义的一种动画效果:
ViewPriorityQueue viewPriorityQueue = new ViewPriorityQueue.ViewBuilder(new MainActivity(), new ViewAnim() {                          @Override                          public void beforeViewAnim(View view) {                              DisplayMetrics metrics = getResources().getDisplayMetrics();                              view.setAlpha(0);                              view.animate().translationY(metrics.heightPixels).start();                          }                            @Override                          public void runViewAnim(View view) {                              view.animate().alpha(1).translationY(0).setDuration(500).start();                          }                      }).addView(views.get(0)).addView(views.get(7)).addView(views.get(1)).addView(views.get(6)).addView(views.get(2)).addView(views.get(3)).addView(views.get(5)).addView(views.get(4)).create();                        viewPriorityQueue.run();

当然你也可以定义一个layout中的不同控件的显示顺序。

项目主页:http://www.open-open.com/lib/view/home/1442137797282