내 앱 코드에서 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();
}
}
스레드 실행 간섭의 추정치가 맞습니까? 그렇다면 이것을 피하는 방법은 무엇입니까? 스레드 처리 코드에 문제가 있습니까?
참고 : 카운터 값 업데이트가 지연되면 "집"버튼을 눌러 앱에서 나가서 앱을 다시 엽니 다.
답해 주셔서 감사합니다. 나는 내 코드에서 AsyncTask를 시도한다. – droidsites