处理程序充当计时器

时间:2011-12-23 17:32:04

标签: android

您好我正在尝试使用处理程序每​​秒使用随机信息更新我的GUI - 信息并不重要只是计时器。我创建了几个处理程序,第二个处理程序就是为了这个工作。

如果我错了,请纠正我: 每个处理程序与一个线程相关联;即创建处理程序的线程。因此,如果我在onCreate()方法中创建一个处理程序,它将附加到GUI线程;主线程。 因此,为了使任务/消息/方法在给定时间运行,我应该使用handler.postDelayed()方法。以下是我的代码片段:

// Button to use handler - commence when pressed 
    handler2Btn = (Button)findViewById( R.id.handler2_Btn );
    handler2Btn.setOnClickListener( new View.OnClickListener() 
    {

        @Override
        public void onClick(View v) 
        {
            new Thread()
            {
                @Override
                public void run() 
                {
                    // Create a new thread which will get the message from handler 1 and send it
                    // when the button has been clicked
                    Message msg2 = handler2.obtainMessage( 1,"New Message for Handler 2" );
                    handler2.sendMessage( msg2 );

                    // Remove any callbacks (messages pending)
                    handler2.removeCallbacks( this );
                    handler2.postDelayed( updateGUI(), 1000 );

                } // End Run

            }.start();// Start the Thread

        }// End on Click
    });

并且updateGUI()方法假定为更新GUI并确保分配的Textview像计时器一样:

private Runnable updateGUI()
{
    return new Runnable()
    {

        // Do this every second
        @Override
        public void run() 
        {
            handlerLabelTxt2.append( ""+j );
            j++;
        }

    };
}

但是我得到的是,当我按下按钮时,GUI会更新但不会每秒更新。目的是使用按钮启动进程,但让进程继续进行,就像一个计时器。

我应该将postDelayed()方法移动到onCreate()方法的主体中吗?我需要一些帮助,因为处理程序让我很困惑!

由于

4 个答案:

答案 0 :(得分:0)

这看起来像是Timer实施的候选者。

答案 1 :(得分:0)

你的帖子在handler2.postDelayed()通话后立即退出,这就是为什么它不能用作计时器。你必须在线程中创建一个循环。

答案 2 :(得分:0)

好的 - 所以我把它分类了。我使用了一个处理程序和runnable的组合,以便运行某个任务。我使用了两种方法中的一种来做到这一点。第一个是实现runnable:

public class timerTask extends Activity implements Runnable
{
private Handler handler;

// TextView for the counter
private TextView counter;

// Button for the stopping the counter
private Button stop;

// Counter
private int i = 0;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate( savedInstanceState );
    setContentView( R.layout.timertask );

    // TextView to be updated
    counter = ( TextView ) findViewById( R.id.counter );

    // Attach the handler here
    handler = new Handler();
    handler.postDelayed( this, 1000 ); 

    // Button to stop the runnable - Work in progress, please ignore
    stop = ( Button ) findViewById( R.id.stop );
    stop.setOnClickListener( new View.OnClickListener() 
    {
        @Override
        public void onClick(View v) 
        {
            handler.removeCallbacksAndMessages( timerTask.class );

        }
    });
}

@Override
public void run() 
{
    counter.setText( " "+i );
    handler.postDelayed( this, 1000 );
    i++;
}

}

handler.postDelayed()安排第一个要执行的消息/任务/事情。我在告诉它在5秒内调用run方法。一旦调用,run方法将每秒执行一次 - 由1000参数表示。

第二种方法与第一种方法基本相同,除了实现Runnable,我在onCreate()方法中创建了一个runnable对象:

Runnable r = new Runnable()
    {
        public void run()
        {
            counter.setText( " "+i );
            handler.postDelayed( this, 1000 );
            i++;
        }
    };
    handler.postDelayed(r, 1000);

我希望这会有所帮助。

P.S。有没有人有任何关于如何改进的建议? 感谢

答案 3 :(得分:0)

  1. 创建Handler实例并设置在指定时间内调用的延迟回调 您应该尝试使用Handler中的postDelayed()。指向Runnable中的run()方法并在其中执行代码。

    Handler mHandler = new Handler();
    mHandler.removeCallbacks(mEndPressedState);
    mHandler.postDelayed(mEndPressedState, 400);
    
  2. 定义将在处理程序计时器通过后触发的Runnable

    private final Runnable mEndPressedState = new Runnable() {
        @Override
        public void run() {
            ((ImageButton)btn).setImageDrawable(getResources().getDrawable(R.drawable.icon_normal));
        }
    };
    
  3. 在run()中,您还可以使用PostAtTime()。这将导致定期run()方法在一段时间后调用。应该在run()中调用updateGUI()。在这里阅读更多内容:

    Timer implementation on Android (my blog)