2011-09-25 3 views
0

내 앱 코드에서 Button보기를 확장하고 (DigiButton으로) onDraw() 메소드를 재정의했습니다. onDraw() 메서드에서 버튼 텍스트를 일부 카운터 값으로 설정합니다. 이 카운터 값은 Handler 개체에 의해 500ms마다 1 씩 감소합니다 (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

이들은 별도의 스레드가 아닙니다. 기본 UI 스레드에서 실행되도록 예약 된 것은 Runnable입니다. Runnable을 대기열에 계속 추가하기 때문에 집을 누를 때 상황이 더 악화됩니다.

AsyncTask.publishProgress을 사용하거나 Thread을 사용하여 AsyncTask 초를 조사해야합니다.

+0

답해 주셔서 감사합니다. 나는 내 코드에서 AsyncTask를 시도한다. – droidsites

관련 문제