`

自定義多任務的Timer,任務按指定間隔時間,順序執行

UI 
阅读更多

需求如下:在做demo的時候,彈出dialog,需要定時先后執行修改ui的動作.

譬如:

第一次 間隔 2s msg:正在下載

第二次 間隔 2s msg:下載完成,開始安裝

第三次 間隔 2s msg:安裝完成

第四次 間隔 1s 關閉dialog.

自定義Timer類如下:

 

public class CustomTimer extends Timer {
  List<Task> taskList = new ArrayList<Task>();

  public CustomTimer addTask(Task task) {
   int index = taskList.size();
   taskList.add(task);
   if (index > 0) {
    taskList.get(index - 1).setNextTask(task);
   }
   return this;
  }

  public void start() {
   if (taskList.size() > 0) {
    sched(this, taskList.get(0));
   }
  }

  private CustomTimer sched(final CustomTimer currentCustomTimer,
    final Task currenttask) {
   final CustomTimer next = new DialogTool().new CustomTimer();
   currentCustomTimer.schedule(new TimerTask() {
    @Override
    public void run() {
     currenttask.run();
     if (currenttask.getNextTask() != null) {
      sched(next, currenttask.getNextTask());
     }
    }
   }, currenttask.getDelay());
   return currentCustomTimer;
  }

  public abstract class Task {
   private Task nextTask;

   public abstract void run();

   public abstract long getDelay();

   public Task getNextTask() {
    return nextTask;
   };

   public void setNextTask(Task next) {
    this.nextTask = next;
   }
  }
 }
//用法如下:

public static void showProgressDialog2(Context context, String title,
   String msg, boolean cancelable, final long runtime, int iconId,
   final String title2, final String msg2, final long closetime) {
  final ProgressDialog mypDialog = new ProgressDialog(context);
  mypDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); //
  // 设置ProgressDialog 标题
  mypDialog.setTitle(title); // 设置ProgressDialog 提示信息
  mypDialog.setMessage(msg); // 设置ProgressDialog 标题图标
  mypDialog.setIcon(iconId); // 设置ProgressDialog 的进度条是否不明确
  mypDialog.setIndeterminate(false); // 设置ProgressDialog 是否可以按退回按键取消
  mypDialog.setCancelable(cancelable); // 让ProgressDialog 显示
  mypDialog.show();
  // final Handler currentHandler = new
  // EHandler(Looper.getMainLooper(),mypDialog);
  final Activity activity = (Activity) context;

  // new Timer().schedule(new TimerTask() {
  // @Override
  // public void run() {
  // // Message msg= currentHandler.obtainMessage(1,1,1,msg2);
  // // currentHandler.sendMessage(msg);
  // // 試試用runOnUiThread方法
  // activity.runOnUiThread(new Runnable() {// 對UI的操作放在uiThread里面
  // public void run() {
  // mypDialog.setMessage(msg2);
  // mypDialog.setTitle(title2);
  // };
  // });
  // new Timer().schedule(new TimerTask() {
  // @Override
  // public void run() {
  // mypDialog.dismiss();
  // }
  // }, closetime);
  // }
  // }, runtime);
  // test...
  DialogTool dt = new DialogTool();
  CustomTimer ct = dt.new CustomTimer();
  dt.new CustomTimer().addTask(ct.new Task() {
   @Override
   public long getDelay() {
    return runtime;
   }

   @Override
   public void run() {
    activity.runOnUiThread(new Runnable() {
     public void run() {
      mypDialog.setMessage(msg2);
      mypDialog.setTitle(title2);
     }

    });

   }
  }).
addTask(ct.new Task() {
   @Override
   public long getDelay() {
    return runtime;
   }

   @Override
   public void run() {
    activity.runOnUiThread(new Runnable() {
     public void run() {
      mypDialog.setMessage("third message");
      mypDialog.setTitle("third title");
     }

    });

   }
  }).addTask(ct.new Task() {

   @Override
   public long getDelay() {
    return closetime;
   }

   @Override
   public void run() {
    mypDialog.dismiss();
   }

  }).start();

 }

分享到:
评论

相关推荐

    Android---Service Timer之执行周期任务

    配合AlarmManager,可以在指定时间启动IntentService执行任务。首先,创建一个IntentService,然后使用AlarmManager设置一个重复的闹钟,每次闹钟触发时启动IntentService。 2. **自定义Service结合Timer/TimerTask...

    多个 timer 使用示例

    合理安排任务的执行顺序和频率,可以提高应用程序的效率和响应性。 压缩包中的文件 `timer.pbl`、`timer.pbt` 和 `timer.pbw` 分别代表 PowerBuilder 的库文件、项目文件和工作区文件: - **timer.pbl**:这是一个...

    異步Timer Timer

    在传统的同步编程中,代码会按顺序执行,如果某个操作需要较长时间,程序会阻塞直到该操作完成,导致UI无响应。异步编程通过回调函数、事件或Promise(在.NET中是Task)来避免这种阻塞,使得程序可以同时处理多个...

    java自定义线程模型处理方法分享

    定时器执行器可以根据预定的时间间隔执行任务,或者在特定时间点执行一次。 3. **线程池(ThreadPool)**:线程池是管理和复用线程的有效机制,它可以避免频繁地创建和销毁线程带来的开销。在Java中,可以使用`java...

    Spring的 Scheduled任务调度.docx

    2. `fixedRate` 参数指定了任务连续执行之间的间隔时间,单位为毫秒,适合需要按照固定频率执行的任务。 3. `fixedRateString` 参数与 `fixedRate` 类似,但接受字符串形式的间隔时间,通常用于从配置文件中读取间隔...

    java后台定时器

    需要注意的是,`Timer`类并非完全线程安全,多个任务之间的执行顺序可能不按预期进行。在高并发场景下,可能需要使用更高级的并发工具,如`ScheduledExecutorService`(来自`java.util.concurrent`包)。 8. **...

    定时任务工具v1.1源代码

    任务调度模块负责设定和管理任务的执行时间,任务执行模块则根据调度信息执行实际的任务,而用户界面模块则为用户提供友好的操作界面。在设计和实现这些模块时,开发者可能运用了面向对象的设计原则,如封装、继承和...

    时间线编程

    2. `System.Threading.Timer`:这个类提供了一个更灵活的定时器,它的回调可以在指定的上下文(例如UI线程)中执行。它通过`Callback`参数传递一个委托,当时间到时,该委托会被调用。 ```csharp using System....

    自动图片播放

    例如,每次任务执行时,我们可以更改ImageView的图片资源来实现图片切换。 ```java class AutoPlayTask extends TimerTask { @Override public void run() { // 在这里实现图片切换逻辑,如更新ImageView的图片 ...

    win消息队列timer升级完美版

    在Windows中,可以使用SetTimer API来创建定时器,它会在指定时间间隔后向消息队列发送一条消息。在"win消息队列timer"中,开发者可能通过自定义的消息处理函数来响应这些定时事件,从而实现特定的功能,比如定期...

    ucosii 自制定时器 和系统定时器

    这种方式避免了中断级的任务执行,保证了任务的顺序性和安全性。 在实现这个实例时,首先需要创建消息队列,定义消息结构和最大消息数量。然后,创建自定义定时器,设置定时时间,并指定一个回调函数,该函数在...

    java实现多线程之定时器任务

    Java中的定时器任务是通过`java.util.Timer`类来实现的,它允许我们在特定时间或按照特定周期执行任务。`Timer`类提供了调度任务的方法,而这些任务是通过`TimerTask`类来定义的。`TimerTask`是`Runnable`接口的子类...

    精密定时器集合(VB)的软件源码

    例如,"按字母或数字顺序排列列表框中的列表项"可能是其中一个功能,它利用定时器来动态更新列表框的内容,使其按照指定的顺序排序。这通常涉及到对数组或集合的操作,以及对用户界面元素的实时更新。 在VB中,常见...

    Quartz开发指南

    - **时间间隔**:支持按固定时间间隔重复执行任务。 每个任务可以被赋予唯一的名字,并可以加入到特定的“任务组”中。触发器也可以被命名并分组,以便更好地管理。任务可以注册多个触发器,而每个触发器都可以根据...

    swift-iOS任务调度器为CPU和内存减负

    例如,可以设定一个定时任务在特定间隔后执行,以减少不必要的CPU占用。 总结来说,通过使用Swift中的GCD、OperationQueue以及定时器,我们可以创建一个高效的任务调度器,有效降低CPU负载,减少内存消耗,提高应用...

    单线程进度条程序,可以方便的添加到你的工程中

    在实际应用中,如果需要处理长时间运行的任务,通常会采用多线程或多任务机制,将进度条更新和任务执行放在不同的线程上,以保持UI的响应性。 总之,这个“单线程进度条程序”旨在提供一种简便的方法,将进度条功能...

    GCD的简单使用simple-use-of-gcd-master.zip

    8. **Cancellation**:GCD提供了一种取消任务的机制,通过`dispatch_group_notify`或`dispatch_group_async`的配合,当所有任务执行完毕或被取消时,可以执行清理操作。 在实际项目中,结合这些知识点,开发者可以...

    JDK5中的多线程并发库

    在JDK5中,多线程并发库引入了一系列新的特性,极...对于定时任务,`Timer`类提供了一种灵活的安排,可以根据需求定制任务执行的时间间隔。在需要控制线程执行顺序时,可以结合`wait()`和`notify()`进行线程间的协作。

    自定义ViewPager实现自动循环手动滑动翻页

    2. **自动滚动**: 在自定义的ViewPager中添加一个定时器(`Timer`)和一个任务(`TimerTask`),用于周期性地改变当前显示的页面。可以通过设置`setCurrentItem()`方法实现自动滑动。记得在用户手动滑动时取消定时器...

    程序设计练习十三.pdf

    2. 程序的概念:程序是由一系列指令组成的,这些指令按照特定的顺序排列,用来告诉计算机执行特定任务。程序员使用计算机语言(如VB、C++、Python等)来编写程序,这些语言更接近人类语言,便于理解。 3. 翻译方式...

Global site tag (gtag.js) - Google Analytics