在我的应用程序代码中,我扩展了Button视图(比如DigiButton)并覆盖了onDraw()方法。在onDraw()方法中,我将按钮文本设置为某个计数器值。 Handler对象每隔500毫秒递减一次该计数器值(我使用Handler.run()方法更新计数器值)。
现在我在“DigiComponent”类中创建了两个具有不同计数器初始值的“DigiButton”实例。 “DigiComponent”有一个按钮,其onClick事件开始运行两个线程。
我看到计数器值更新有一些延迟(在两个实例上)。我以为每个线程都在干扰其他线程的执行。为了确认这一点,我刚开始只运行一个“DigiButton”实例。然后计数器值更新正确。以下是我的代码:
class DigiButton extends Button{
private int counter;
private Runnable handleRunnable;
DigiButton(Context context,int val){
super(context);
counter = val;
initialize();
}
private void initialize(int val){
digiHandler = new Handler();
handleRunnable = new Runnable(){
public void run(){
}
};
}
private void updateCounter(){
counter++;
if(counter>0){
runCounter();
}
}
public void runCounter(){
digiHandler.postDelayed(handleRunnable, 500);
}
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
setText(counter);
}
}
public class DigiComponent extends Activity implements OnClickListener{
DigiButton thread1, thread2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
thread1 = new DigiButton(this,30000);
thread2 = new DigitButton(this,20000);
Button test = new Button(this);
LinearLayout layout = new LinearLayout(this);
layout.addView(thread1);
layout.addView(thread2);
layout.addView(test);
test.setClickListener(this);
setContentView(layout);
}
public void onClick(View v){
thread1.runCounter();
thread2.runCounter();
}
}
我对线程执行干扰的猜测是否正确?如果是这样如何避免这种情况?我的线程处理代码有问题吗?
注意:当我按“主页”按钮退出应用程序并再次打开应用程序时,计数器值更新的延迟会更糟。
答案 0 :(得分:0)
这些不是单独的线程。这些是Runnable
计划在主UI线程上运行。当你按回家时会变得更糟,因为你正在向队列添加越来越多的Runnable
(重新安排自己)。
您应该使用AsyncTask
查看AsyncTask.publishProgress
或使用基本的Thread
。