2009-05-20 3 views
0

Android 애플리케이션의 경우 ListActivity가 있습니다. 이 ListActivity는 내 서비스의 항목으로 채우는 SimpleAdapter를 사용합니다. 그래서, 내 코드에서, 내가 할 :Android 서비스 결과의 목록보기 항목이 정지되었습니다.

MySuperCoolService.Binder serviceBinder = null; 
private ServiceConnection serviceConnection = new ServiceConnection() 
    { 
     public void onServiceConnected(ComponentName className, IBinder service) { 
      Log.d(TAG, "Service connection: connected!"); 
      serviceBinder = (MySuperCoolService.Binder)service; 
     } 
     public void onServiceDisconnected(ComponentName className) { 
      Log.d(TAG, "Service connection: disconnected"); 
      serviceBinder = null; 
     } 
    }; 
bindService(new Intent(this, MySuperCoolService.class), serviceConnection, BIND_AUTO_CREATE); 
while(serviceBinder==null) { 
    Thread.Sleep(1000); 
} 
// now retrieve from service using binder and set list adapter 

이 모든 작업은 거의 모든 시간 (초 이하)를 취하지 않는, 그래서는 UI 스레드에서 실행하려는. 내에서 onCreate를 참조하십시오

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    fillDataUsingCodeAbove(); 
} 

난이 UI 스레드에서 실행하려는 이유는 당신이있는 경우 목록 항목을 선택하거나,리스트 뷰에서 특정 위치로 스크롤 한 당신이 장치를 회전하거나 것입니다 내 활동이 다시 시작될 때 키보드 또는 뭔가를 (구성 변경을 트리거하기 위해) 꺼내십시오. Android는 onCreate 직후에 상태를 복원하려고 시도합니다. 하지만 별도의 스레드에서 실행하면 그렇지 않습니다. 또한 멋진 fadein 애니메이션도 있습니다 :)
UI 스레드에서 실행하는 데 문제가 있습니다. 서비스에 바인딩하려고하면 해당 서비스 바인드 요청이 메시지 큐에 놓입니다. 그런 다음 루프에 들어가면 메시지 대기열이 반복되지 않습니다. 그래서 서비스가 묶일 때까지 기다리고 있기 때문에 프로그램이 멈추고 루프가 끝날 때까지 서비스가 묶이지 않습니다. 내 루프 내에서 Looper.loop() 퍼팅 생각했지만, 단지 Looper.loop() 그것을 중단 것을 (나는 이유를 알지 못한다.) 이러한 오랜 질문에 대한
죄송합니다,
이삭 월러

답변

0

난 당신이 AsyncTask를 사용해야한다는 생각을 , 그것은 UI 스레드를 loca하지 않으며 훨씬 더 당신이 이미 가지고있는 것보다 복잡하지 않을 것이다.