2011-09-15 2 views
2

SMACK을 사용하여 XMPP 클라이언트를 작성하고 있습니다.안드로이드 runOnUiThread - Activity 전달 방법

연락처 목록을 업데이트하려면 ListAdapter.notifyDataSetChanged가 UI 스레드에서 실행되어야하지만, 분명히 SMACK 라이브러리는 RosterListener에서 멀티 스레딩을 사용합니다. 실제로는 좋은 점입니다. 그러나 문제는 다음과 같습니다. UI 스레드에서 유효한 컨텍스트가 필요합니다.

하지만 어떻게받을 수 있습니까? 액티비티의 컨텍스트를 RosterListener의 레지스터 함수에 전달하는 것이 처음이었습니다.하지만 레지스터 함수에 도달하기 전에 다른 클래스의 일부 함수가 있습니다. 실제로 전달하기를 좋아하지 않습니다. 그 문맥은 마침내 목적지에 도달 할 때까지 계속해서 반복된다.

나는이 문제에 직면 한 유일한 사람이 아니라고 생각합니다. 어떻게 해결할 수 있습니까?

어쩌면 싱글 톤을 저장하는 것일 수도 있습니다. (내 의견으로는 훨씬 덜 유리한 생각 ...) 아니면 내 전체 디자인에 결함이 있습니까? 어디에서나 UI 스레드를 얻을 수 있습니까?

결론 : 나는 여러 가지 기능을 통해 논점으로 컨텍스트를 전달하는 순간을 처리하는 방법을 알지 못하지만이를 수행하는 더 좋은 방법이 있습니다.

도움 주셔서 감사합니다.

답변

1

서비스에 XMPP 코드를 입력하고 브로드 캐스트를 보냅니다.관심있는 활동은 해당 방송에 등록하기 만하면됩니다. 그렇게하면 UI 스레드와 Activity 컨텍스트의 가용성에 대해 다시는 걱정할 필요가 없습니다.

+0

입니다. 특히 채팅 클라이언트의 경우 백그라운드 서비스가 매우 유용하며 문제가 해결됩니다. 고마워 ;-) –

+0

그러면이 대답을 수락 하시겠습니까? –

0

입니다하지 않는, 내가 얻을 콜백으로 작업하는 것처럼 느껴집니다. Smack 또는 무엇이든지간에 작업자 스레드에서 다시 전화를 걸면 그 때 주 UI 스레드에 게시하려고합니다.

제 경험상 콜백은 항상 콜백을 등록 할 때 전달한 데이터의 사용자 지정 부분과 연결될 수 있으며 실제로 콜백 될 때 수신됩니다.

  • 글로벌 꼬추의 어떤 종류를 사용합니다 (모델 기대하게하고 반환 당신이
  • 를 좋아하는 경우에 싱글을 호출 : 당신의 맥락에서

    나는 가난한 디자인이라고 생각 두 가지 방법이있다 안드로이드 및 UI 전용) 컨텍스트

대신 액티비티로 구현 된 작은 인터페이스를 만들고 모델에서이 인터페이스의 인스턴스를 허용하고 예를 들어 등록까지 다른 레이어로 전달합니다. .

이 인터페이스에 의해 노출 된 메소드는 비동기 적으로 호출되며 적절하게 문서화하여 runOnUiThread() 또는 이와 유사한 메소드를 사용해야 함을 나타냅니다.

이 방법을 사용하면 컨텍스트 (플랫폼 및 UI 세부 정보)를 장소와 모델에 정확히 전달하지 않을 수 있습니다. 또한 전역/정적 데이터를 피하면 다양한 문제, 충돌 및 기타 메모리 누수가 발생할 수 있습니다.

1

나는 더 깔끔하고 더 모듈화 된 방법을 발견했습니다. 이를 위해서는 Application Context을 정의해야합니다. 일단 가지고 있다면 Activity에 대한 참조가없는 혼란없이 모든 클래스 라이브러리에서 RunOnUIThread으로 전화 할 수 있습니다. 어디서나 클래스 라이브러리를 호출 내에서

:

Handler handler = new Handler(Application.Context.MainLooper); 
handler.Post(() => doStuff()); 

내가 MonoDroid를 사용할 때이 C#으로 작성되어 있음을 명심하시기 바랍니다,하지만 난 그게 자바와 매우 유사하다 생각합니다. ApplicationContext를 만드는 방법은 thread

관련 문제