2010-04-24 7 views
1

AsyncTask가 RemoteService에 바인딩되는 동안 무기한 ProgressDialog를 표시하려고합니다. RemoteService는 서비스가 처음 생성 될 때 사용자 연락처 목록을 작성합니다. 연락처 목록이 길면 5 초에서 10 초 정도 걸릴 수 있습니다.AsyncTask가 완료 될 때까지 ProgressDialog가 표시되지 않습니다.

내가 겪고있는 문제는 RemoteService가 연락처 목록을 작성하기 전까지 ProgressDialog가 표시되지 않는다는 것입니다. 나는 심지어 ProgressDialog 시간을주기 위해 Thread.sleep을 넣으려고 시도했다. sleep 문을 사용하면 ProgressDialog가로드되어 회전을 시작하지만 RemoteService가 작업을 시작하자마자 잠글 수 있습니다.

방금 ​​AsyncTask를 더미 코드로 바꾸고 잠시 동안 잠자기 상태로두면 모든 것이 잘 작동합니다. 그러나 작업이 실제 작업을 수행해야하는 경우, UI가 앉아서 기다리는 것과 같습니다.

무엇이 잘못된 일인지에 대한 아이디어가 있습니까?

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.d(IM,"Start Me UP!!"); 
    setContentView(R.layout.main); 
    Log.d(IM, "Building List View for Contacts"); 
    restoreMe(); 
    if (myContacts==null){ 
     myContacts = new ArrayList<Contact>(); 
     this.contactAdapter = new ContactAdapter(this, 
                R.layout.contactlist, 
                myContacts); 
     setListAdapter(this.contactAdapter); 
     new BindAsync().execute(); 
    } 
    else{ 
     this.contactAdapter = new ContactAdapter(this, 
                R.layout.contactlist, 
                myContacts); 
     setListAdapter(this.contactAdapter); 

    } 
} 

private class BindAsync extends AsyncTask<Void, Void, RemoteServiceConnection>{ 
    @Override 
    protected void onPreExecute(){ 
     super.onPreExecute(); 
     Log.d(IM,"Showing Dialog"); 
     showDialog(DIALOG_CONTACTS); 
    } 
    @Override 
    protected RemoteServiceConnection doInBackground(Void... v) { 
     Log.d(IM,"Binding to service in BindAsync"); 
     try{ 
     Thread.sleep(2000); 
     } catch (InterruptedException e){ 

     } 

     RemoteServiceConnection myCon; 
     myCon = new RemoteServiceConnection(); 
     Intent i = new Intent(imandroid.this,MyRemoteService.class); 
     bindService(i, myCon, Context.BIND_AUTO_CREATE); 
     startService(i); 
     Log.d(IM,"Bound to remote service"); 
     return myCon; 
    } 
    @Override 
    protected void onPostExecute(RemoteServiceConnection newConn){ 
     super.onPostExecute(newConn); 
     Log.d(IM,"Storing remote connection"); 
     conn=newConn; 
    } 

}; 

편집 : 추가 된이 onCreateDialog

protected Dialog onCreateDialog(int id){ 
    switch(id){ 
    case DIALOG_CONTACTS: 
     ProgressDialog progDialog = new ProgressDialog(imandroid.this); 
     progDialog.setMessage("Loading Contacts... Please Wait"); 
     progDialog.setCancelable(false); 
     return progDialog; 
    default: 
     return super.onCreateDialog(id); 
    } 
} 
+1

onCreateDialog() 코드는 어디에 있나요? – Matthias

+0

Matthias, onCreateDialog를 추가했습니다. – tedwards

답변

0

doInBackground()에서 bindService()하지 않습니다. 첫째, 거의 순간적이므로 백그라운드 스레드에 넣을 필요가 없습니다. CPU 시간과 배터리를 낭비하는 것뿐입니다. 둘째, Context에 대한 Looper 및 메시지 큐를 사용해야하므로 백그라운드 스레드에 배치하는 것이 위험합니다.

또한 서비스에 바인딩되어 있고 서비스를 시작하고 있습니다. 적절한 경우가 몇 가지 있지만 일반적으로 하나 또는 다른 것이 필요합니다.

+0

그게 바로 그게 아니야. 나는 사용자 연락처 목록을 만들고 유지하기 위해 서비스가 필요합니다. 그래서 나는 onCreate에 연락처를 만드는 서비스를 가지고 있습니다. 그런 다음 바인딩 된 후 서비스에서 연락처를 가져 와서 표시합니다. AsyncTask가 RemoteService에 바인딩 한 후 종료되기 때문에 동시성 문제가있을 것이라고 생각하지 않았습니다. 어쩌면 UI 스레드를 차단할 수 있습니까? 여러 응용 프로그램을 서비스에 바인딩 할 계획이므로 서비스가 바인딩되고 시작되었습니다. 이것은 적절하지 않습니까? – tedwards

+0

"그래서 연락처를 작성하는 서비스를 onCreate에 있습니다." onCreate()는 바인딩을 시도하는 위치에 상관없이 메인 애플리케이션 쓰레드에서 호출되기 때문에 * 논리를 서비스의 AsyncTask로 옮긴다. – CommonsWare

+0

나는 이와 비슷한 것을 시도했지만 RemoteServiceConnection에 의해 호출 된 결과를 반환하기 전에 연결 생성 스레드가 연결될 때까지 기다려야하는 문제에 부딪혔다. 연락처를 소비 할 준비가되면 알려주는 메시지를 UI 스레드로 다시 전달하는 방법을 알아야 할 것 같습니다. 도움 주셔서 감사합니다. 그건 그렇고, 나는 당신의 책을 사는 것을 고려하고있었습니다. 이것은 거래를 봉인했다. – tedwards

관련 문제