IMHO 전체 목록보기 및 어댑터를 생략해야합니다. 가장 좋은 방법은 자주 업데이트해야하는 요소에 대한 자체 뷰를 만드는 것입니다.
예를 들어 setAbsouluteheading이있는 HeadingView라는보기를 만듭니다. 이 설정자는 어댑터에서 사용됩니다. 그런 다음 센서는 SensorEventListener를 구현하여 센서를 관찰하고 장치 표제를 가져옵니다. 상대 방향이 변경되어야하는 경우 HeadingView가 자체를 업데이트합니다. 이 경우의 문제점은 HeadingView가 센서 이벤트에 대해 등록/등록 취소해야 할 때 감지입니다. onWindowFocusChanged이 유망 해 보이며 onWindowSystemUiVisibilityChanged (API 레벨 16)이 필요합니다.
몇 가지 구석이있을 수 있으며, 필요할 때 센서가 관찰되지 않아도 뷰가 등록 해제되지 않을 수 있습니다. 이것은 슬립 모드에서 끔찍한 전력 소비로 이어질 수 있으므로 광범위한 테스트를 수행해야합니다.
이 HeadingView와 센서 사이의 통신을 수행하는 대체 방법이있을 수 있지만 일반적으로 내 개념은 좋은 해결책이라고 생각합니다.
업데이트 :
센서를 사용하지 않도록 설정하고 메모리 누수가 발생하지 않는 것을 감지하는 데 문제없이이 HeadingView와 통신하는 방법을보다 잘 이해했습니다. 대답은 week reference 또는 정확히 WeakHashMap입니다.
HeadingView보기는 앞에서 설명한 것처럼 다소 차이가 있지만 생성자에서 YourActivity에 대한 존재를 알립니다.그래서 그런 식으로 뭔가를 BES 것 :
public class HeadingView extends View {
public HeadingView(Context context) {
super(context);
YourActivity activity = (YourActivity) context;
activity.addWeekSensorObserver(this);
}
}
그리고 당신의 활동 :
public class YourActivity extends Activity implements SensorEventListener {
// there is no WeekSet and WeakHashMap is more handy then List<WeakReference>
private final WeakHashMap<HeadingView, Object> sensorObservers = new WeakHashMap<HeadingView, Object>();
public void addWeekSensorObserver(HeadingView headingView) {
sensorObservers.put(headingView, null);
}
private updateHeadings(float[] deviceHeading) {
Set<HeadingView> keySet = sensorObservers.keySet();
for (HeadingView headingView : keySet) {
headingView.setDeviceHeading(deviceHeading);
}
}
}
지금 활동에 처리
표준 센서가 너무 센서를 비활성화 할 때 감지 적용됩니다 문제가되지 않습니다 그리고 당신은 필요 없어 메모리 누출 걱정. 나는 심지어 당신이 코드를 많이 바꿀 필요가 없다고 생각한다. :) 더 나은 인터페이스를 정의 할 수 있습니다.
원하는 정밀도는 무엇입니까? 당신이 큰 거리 (km와 같은)를 다룰 경우 매 초마다 그들을 업데이트 할 필요가 없기 때문에 원인이된다. – shem
분명히 킬로미터에 있지만 사람들이 가까워 질수록 더 세밀해질 수 있습니다. (나는 "<1km"를 표시하는 것만으로 도망 갈 수 있지만 보게한다). 하지만 그건 진짜 문제가 아니에요, 제가 정말로 걱정하고있는 나침반 이죠. – somanys21