`

定時線程(Timer)操作UI界面

阅读更多

需求:先彈出dialog,然后,隔一定時間,修改dialog的msg.

如果只是dismiss dialog 并不需要透過Handle

 

runOnUiThread 如果開啟新的定時線程,不起作用.

 

android的線程通訊透過handle來處理,這里也一樣

 

 

 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);
  // Activity activity = (Activity) context;
  // activity.runOnUiThread(new Runnable() {// 對UI的操作放在uiThread里面
  // public void run() {
  // };
  // });
  new Timer().schedule(new TimerTask() {
   @Override
   public void run() {
//    mypDialog.setTitle(title2); //
    // 设置ProgressDialog 提示信息
//    mypDialog.setMessage(msg2);
    Message msg= currentHandler.obtainMessage(1,1,1,msg2);
    currentHandler.sendMessage(msg);
    new Timer().schedule(new TimerTask() {
     @Override
     public void run() {
      mypDialog.dismiss();
     }
    }, closetime);
   }
  }, runtime);

 }

 static class EHandler extends Handler {
  private ProgressDialog progressDialog;
  public EHandler(Looper looper){
   super(looper);
  }
  public EHandler(Looper looper, ProgressDialog dialog) {
   super(looper);
   progressDialog = dialog;
  }
  @Override
  public void handleMessage(Message msg) {
   progressDialog.setMessage(msg.obj.toString());
  }
 }

參考http://www.iteye.com/wiki/topic/667340文章,runOnUiThread 正確做法是在里面修改ui,而不能另開線程.我估計它的背后也就是利用了handle在處理.

代碼如下:

 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);

 }

 

 

分享到:
评论

相关推荐

    关于winform使用timer进行多线程操作的例子

    总结一下,这个例子展示了如何在Winform应用中利用`System.Timers.Timer`组件进行多线程操作,以及如何处理UI线程与后台线程之间的交互。通过这个例子,开发者可以学习到如何在不影响用户体验的情况下执行定时任务,...

    C# Timer的多线程使用方法

    在.NET框架中,C#提供了两种Timer类,用于在多线程环境中实现定时触发操作:System.Threading.Timer和System.Timers.Timer。这两种Timer虽然都与时间调度相关,但在使用上和特性上有所不同。在这个主题中,我们将...

    自己编写的Delphi组件定时器Timer,内支持线程,不会像D原生那样卡顿及界面.

    在Delphi编程环境中,系统自带的TTimer组件虽然方便,但在某些复杂场景下,例如需要在定时器触发事件时执行耗时操作,可能会导致应用程序的UI线程阻塞,出现界面卡顿的问题。为了解决这个问题,开发者有时会编写...

    WPF实现定时刷新UI界面功能

    在WPF应用中,定时刷新UI界面是一项常见的需求,通常用于实时显示动态更新的数据。本文将详细解析如何在WPF中实现这一功能,以确保用户界面能够及时反映出后台数据的变化。 首先,我们来看给出的代码片段,其中的...

    WPF定时刷新UI

    在Windows Presentation Foundation(WPF)应用开发中,有时我们需要实现用户界面(UI)的定时刷新功能,例如更新TEXTBOX中的文本。WPF提供了一种机制,允许我们在后台线程上执行耗时操作,并通过 Dispatcher 或其他...

    VC中TIMER与多线程的对比.zip

    这意味着TIMER事件的处理会阻塞主线程,如果定时任务复杂或耗时,将影响主线程的响应速度,可能导致用户界面卡顿。 相反,多线程提供了一种并行执行任务的方法。在创建新的线程后,每个线程都有自己的执行上下文,...

    Android的线程使用来更新UI

    然而,由于Android的主线程(也称为UI线程)负责处理所有的用户输入事件以及绘制UI,因此任何耗时的操作都应避免在此线程中执行,以免导致应用无响应(ANR)。为了解决这一问题,Android提供了多种机制来确保UI的...

    C#定时器(Timer)

    - **同步问题**:由于它运行在UI线程,因此避免在Tick事件中进行长时间操作,以免阻塞用户界面。 4. **使用示例** - `System.Threading.Timer` 示例: ```csharp Timer timer = new Timer((state) => { ...

    異步Timer Timer

    总结起来,"異步Timer Timer"涉及的是在VB环境中利用Timer控件进行异步事件处理的技术,它能够有效地提升应用程序的性能和用户体验,特别是在需要定时执行任务或者进行长时间操作时。通过合理运用这些知识,开发者...

    Java编写线程动画

    - **定时器**:Java提供了Timer和ScheduledExecutorService等工具来定期执行任务,实现动画的定时更新。 3. **Java GUI库** - **AWT(Abstract Window Toolkit)**:Java早期的GUI库,提供了基本的组件和事件处理...

    TThreadTimer_DelphiXE8多线程_多线程_

    在单线程程序中,所有的任务都在同一个线程上执行,这可能导致UI(用户界面)无响应,尤其是在执行长时间运行的任务时。多线程则允许同时执行多个任务,每个任务在一个独立的线程上运行,从而提高程序的并行处理能力...

    多线程雷达扫描界面

    5. **定时任务**:为了模拟雷达的连续扫描,可能需要使用`java.util.Timer`或`ScheduledExecutorService`来定期执行扫描更新。这可以确保雷达图像以一定的频率刷新,模拟真实的扫描效果。 6. **性能优化**:为了在...

    timer定时运行某段代码(源码,支持VS08版及以上)

    同时,如果定时器触发的任务执行时间较长,可能会阻塞UI线程,导致界面卡顿,这时需要考虑异步处理或者使用更高级的定时解决方案,如`System.Threading.Timer`。 在压缩包中的"timer定时运行某段代码"可能是包含了...

    Java多线程机制(讲述java里面与多线程有关的函数)

    9.9 计时器线程Timer: Timer类和TimerTask类用于定时执行任务,可以设置间隔时间定期执行或一次性执行。 9.10 线程联合: 线程联合(Join)是让一个线程等待另一个线程完成后再继续执行,通过调用`join()`方法实现...

    C# wpf timer 应用

    WPF中的`DispatcherTimer`类来自于`System.Windows.Threading`命名空间,它与Windows Forms中的`System.Timers.Timer`或`System.Threading.Timer`不同,因为它运行在UI线程上,可以方便地更新UI元素。创建一个`...

    C#编写了一个定时小工具

    在这种Timer的EventHandler中可 以直接获取和修改UI元素而不会出现问题–因为这种Timer实际上就是在UI线程自身上进行调用的。 2、它是一个基于Form的计时器 3、创建之后,你可以使用Interval设置Tick之间的跨度,...

    多线程测试

    而多线程技术则提供了更高的灵活性,特别是在处理耗时操作时,它不会阻塞UI线程,确保用户界面的流畅性。 在进行多线程测试时,我们需要关注线程安全、竞态条件和死锁等问题。使用`lock`语句、`Monitor`类或者`...

    基于QT的多线程定时器

    在基于QT的多线程定时器中,可能有一个或多个线程负责定时任务的执行。线程间的通信可以通过信号和槽(Signals & Slots)机制实现,这是QT的一个核心特性,确保了线程安全的数据交换。 3. **QT定时器(QTimer)** ...

    C# WinForm定时提醒器(有源码)

    `System.Windows.Forms.Timer` 是专门为Windows Forms设计的,它在UI线程上运行,适合用来执行短时间的操作或者与用户界面交互的任务。在这个闹钟程序中,可能用它来更新界面上的时间显示,或者在提醒触发时弹出...

Global site tag (gtag.js) - Google Analytics