在Android中执行(使用Handler)时线程相互干扰

时间:2011-09-25 12:19:24

标签: android

在我的应用程序代码中,我扩展了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();
   }
 }

我对线程执行干扰的猜测是否正确?如果是这样如何避免这种情况?我的线程处理代码有问题吗?

注意:当我按“主页”按钮退出应用程序并再次打开应用程序时,计数器值更新的延迟会更糟。

1 个答案:

答案 0 :(得分:0)

这些不是单独的线程。这些是Runnable计划在主UI线程上运行。当你按回家时会变得更糟,因为你正在向队列添加越来越多的Runnable(重新安排自己)。

您应该使用AsyncTask查看AsyncTask.publishProgress或使用基本的Thread