2010-06-09 9 views
0

주 활동의 버튼 누르기에 대한 응답으로 데이터를 가져 오는 클래스가 있습니다. 불행히도이 클래스는 활동이나 서비스가 아니기 때문에 문제가 계속 발생합니다. 예를 들어, 문맥없이 나는 문자열에 자원 ID를 변환 할 수 없습니다 :이 닫힐 때안드로이드에서 서비스를 사용하는 경우

getString(R.string.example_string); // Doesn't work 

나는 클래스를 중지 서비스에이 클래스를 확인하고 주요 활동을해야 하는가? 이 컨텍스트를 Activity에서이 클래스로 전달해야합니까?

MyClass c = new MyClass(this); 

또는이 문제를 해결할 더 좋은 방법이 있습니까?

이 문제는이 수업에서 토스트를 보내려고 할 때도 나타납니다.

업데이트 : Erich와 Janusz는 새로운 스레드를 생성하고 그 스레드를 죽이지 않는다는 점을 제외하면 완벽하게 작동하는 AsyncTask 클래스의 방향으로 나를 지적했습니다. 이것은 사용자가 버튼을 누를 때마다 다른 스레드가 추가되고 이전 스레드가 바로 거기에 앉아 있음을 의미합니다.

답변

4

라이프 사이클이 활동에서 분리 된 백그라운드 작업이있는 경우 Service을 사용합니다. 이 경우 Service은 고유 한 Context을 가지므로이를 전달할 필요가 없습니다. 그러나 UI 이벤트에 대한 응답으로 백그라운드 작업을 수행해야하며 (선택적으로 결과를 다시 UI에 게시 할 수도 있음) 스레드)를 사용하는 경우 AsyncTask을 사용하는 것이 좋습니다.

+0

대단히 감사합니다! AsyncTask 정확히 내가 무엇을 찾고 있었다. 유일한 문제는 onPostExecute()가 호출 된 후에도 AsyncTask 스레드가 계속 실행된다는 것입니다. AsyncTask의 새로운 인스턴스를 만들어야하기 때문에 남용 스레드가 많이 생길 수 있습니다. 스레드가 죽는 것을 어떻게 확인할 수 있습니까? – Computerish

2

웹 백엔드에 대한 변경 사항을 게시하거나 전화 메모리에서 무언가를로드하여 화면에 표시하는 것과 같은 작은 것이있는 경우 Erich에 동의하면 Async Task을 사용하십시오. 작업이 매우 "빠름"(몇 초) 동안 종료되면 활동 내에서 익명의 클래스를 만들 수 있습니다. 이렇게하면 작업 내부의 외부 활동에 대한 암시 적 참조를 사용할 수있게되며 여기에서 컨텍스트를 가져올 수 있습니다.

작업이 더 오랫동안 실행되는 경우 컨텍스트를 전달할 수 있습니다. 컨텍스트를 전달할 경우 this.getApplicationContext()를 사용하여 활동에서 전달하지 않으려 고하면 활동에 대한 참조 수가 최소화되고 가비지 컬렉터가 올바르게 정리됩니다.

관련 문제