您好我正在尝试使用处理程序每秒使用随机信息更新我的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()方法的主体中吗?我需要一些帮助,因为处理程序让我很困惑!
由于
答案 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)
创建Handler实例并设置在指定时间内调用的延迟回调 您应该尝试使用Handler中的postDelayed()。指向Runnable中的run()方法并在其中执行代码。
Handler mHandler = new Handler();
mHandler.removeCallbacks(mEndPressedState);
mHandler.postDelayed(mEndPressedState, 400);
定义将在处理程序计时器通过后触发的Runnable
private final Runnable mEndPressedState = new Runnable() {
@Override
public void run() {
((ImageButton)btn).setImageDrawable(getResources().getDrawable(R.drawable.icon_normal));
}
};
在run()中,您还可以使用PostAtTime()。这将导致定期run()方法在一段时间后调用。应该在run()中调用updateGUI()。在这里阅读更多内容: