ProgressDialog не отображается, пока AsyncTask не завершится - PullRequest
1 голос
/ 24 апреля 2010

Я пытаюсь отобразить неопределенный ProgressDialog, пока AsyncTask связывается с RemoteService. RemoteService создает список контактов пользователей при первом создании службы. Для длинного списка контактов это может занять 5 ~ 10 секунд.

Проблема, с которой я столкнулся, заключается в том, что ProgressDialog не отображается до тех пор, пока RemoteService не создаст свой список контактов. Я даже попытался вставить Thread.sleep, чтобы у ProgressDialog было время появляться. С помощью оператора sleep ProgressDialog загружается и начинает вращаться, но затем блокируется, как только RemoteService начинает выполнять свою работу.

Если я просто превращу AsyncTask в фиктивный код и просто оставлю его на некоторое время, все будет хорошо. Но когда задача должна выполнять реальную работу, пользовательский интерфейс просто сидит и ждет.

Есть идеи, что я делаю не так?

    @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;
    }

};

РЕДАКТИРОВАТЬ: Добавлено на CreateDialog

 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 Ответ

0 голосов
/ 24 апреля 2010

НЕ делайте bindService() из doInBackground(). Во-первых, это почти мгновенно, поэтому вам не нужно иметь его в фоновом потоке - все, что вы делаете, это тратит время процессора и батарею. Во-вторых, он должен работать с Looper и очередью сообщений для вашего Context, поэтому помещать его в фоновый поток опасно ИМХО.

Также обратите внимание, что вы оба привязываетесь к сервису и запускаете сервис. Есть несколько случаев, когда это уместно, но обычно вам нужен только один или другой.

...