2011-09-25 8 views
0

私のアプリケーションコードでは、ボタンビュー(DigiButton)を拡張し、onDraw()メソッドをオーバーライドしました。 onDraw()メソッドでは、ボタンのテキストをいくつかのカウンタ値に設定しています。このカウンタの値は、ハンドラオブジェクトによって500ミリ秒ごとに1ずつ減分されます(カウンタ値を更新するためにHandler.run()メソッドを使用しています)。Androidでハンドラを使用して実行する際のスレッドの干渉

"DigiComponent"クラスのカウンタの初期値が異なる2つの "DigiButton"インスタンスを作成しました。 "DigiComponent"には、onClickイベントが両方のスレッドの実行を開始するボタンがあります。

(どちらのインスタンスでも)カウンタ値の更新にいくらか遅延があります。私は、スレッドのそれぞれが他のスレッドの実行を妨害していると考えました。これを確認するために、ただ1つの "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

これらは別々のスレッドではありません。これらは、メインのUIスレッドで実行するようにスケジュールされています(Runnable)。 Runnableを待ち行列に追加しているので、自宅を押すと悪化します(自分自身を再スケジュールします)。

AsyncTask.publishProgressを使用してAsyncTaskを調べるか、基本的なThreadを使用する必要があります。

+0

答えに感謝します。私は自分のコードでAsyncTaskを試しています。 – droidsites

関連する問題