2014-02-07 6 views
2

온도, 속도 등의 측정 값을 표시하는 앱이 있습니다.UI 요소 업데이트 - 안되요?

MVC 패턴에 더 많거나 적게 붙어있어서 (블루투스 구성 요소에서) 값을 수신하고 특수 값 처리기로 정렬하는 값을 얻습니다. 그것들은 물건 등을 계산하고 (지리적 좌표로부터 속도를 올리는 등), 액티비티를 확장하고 값을 출력하기로되어있는 값을 View 컴포넌트로 전달합니다. 일부 값 처리기는 자체 스레드에 있거나 값 처리기 전체가 하나의 단일 스레드가됩니다.

그래서 처음에는 "runOnUIThread"를 시도했지만 이것이 많은 가치를 지니고 있기 때문에 다른 것은 UI 스레드에서 발생하지 않으며 MVC 패턴의 아이디어는 아닙니다.

그렇다면 핸들러에 대해 생각해 보았지만 다른 스레드에서 핸들러를 "찾을 수 없다"는 문제가있어서 전달해야 할 것이므로 많은 헤더 변경이 필요합니다.

그렇다면 어디서나 접근 할 수있는 정적 메서드를 사용하는 개인 클래스에 대해 생각해 보았지만 그것이 영리하다면 몰라요.

무엇을 권하고 싶습니까?

답변

1

AsyncTask을 사용해 보셨습니까? 지금

class CalculationTask extends AsyncTask<Integer, Integer> { 
... 
    public interface Callback{ 
     void onCalculationComplete(Integer result); 
    } 
... 
} 

AsyncTask에서 doInBackground() 메소드를 오버라이드 (override)과의 계산을위한 프로그램 로직을 넣어 : 당신은 AsyncTask를 확장하고, 같은 것을 간단한 콜백 인터페이스를 포함하는 클래스를 만들 수 있습니다.

@Override 
protected int doInBackground(Integer... params){ 
    makeNeededCalculation(); 
    ... 
} 

계산이 완료되면 AsyncTask는 onPostExecute() 메서드를 호출합니다. 이 방법에서는 콜백 인터페이스를 참조 할 수 있습니다.

@Override 
protected void onPostExecute(Integer result){ 
    mCallback.onCalculationComplete(result); 
} 

그런 다음 값 블루투스를받는 클래스에 AsyncTask를의 인스턴스를 생성해야하며,이 콜백 인터페이스를 구현합니다.

new CalculationTask(this, new CalculationTask.Callback(){ 

    @Override 
    public void onCalculationComplete(Integer result){ 
     mView.setText("The new value is "+result); 
    } 
}).execute(valueFromBluetooth);