Android ProgressDialog не будет вращаться

Это мой первый пост о стеке, поэтому, пожалуйста, будьте со мной нежны! Я уверен, что то, что я пытаюсь сделать, возможно, и это то, что я сделал (или не сделал?), что вызывает проблему... Я просто не уверен, что это что-то есть.

Что я пытаюсь сделать:
Показать ProgressDialog, пока мое приложение синхронизирует и обрабатывает загруженные данные.

Проблема:
ProgressDialog отображается, но не вращается (из-за чего кажется, что он завис), происходит синхронизация и обработка, ProgressDialog закрывается, приложение продолжает работать в обычном режиме.

Как я сейчас пытаюсь это сделать:
Создайте диалоговое окно ProgressDialog — в моем действии
Выполните синхронизацию — в моем сервисе
Обработайте данные — в моем сервисе
Закройте ProgressDialog - в моей деятельности

Что я пробовал:
Использование потока (код ниже) Использование AsynTask (при необходимости можно предоставить код) Использование обработчика (при необходимости можно предоставить код)

Потратив много времени на поиск ответа на мой вопрос, похоже, у других была такая же или похожая проблема, и им удалось решить ее, используя одну из приведенных выше идей. Однако мне не удалось реализовать ни одну из этих идей для решения моей конкретной проблемы. Это убеждает меня, что я что-то делаю не так... Я просто не знаю, что именно.

Исходный код, который я написал и использую в качестве основы для всех моих попыток исправления:
Сначала

public class myActivity extends ListActivity {
    private ProgressDialog dialog;
    private boolean mIsBound;
    private myService mBoundService;
    private ServiceConnection mConnection;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /*if we need to login start login activity for result*/
        ...
    }

    ...
    /*other methods*/
    ...
}

тогда

protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    switch (requestCode){
        case ACTIVITY_LOGIN:
            /*after login we know we always need to sync*/
         dialog = new ProgressDialog(myActivity.this);
         dialog.setMessage("Synchronising...");
         dialog.setIndeterminate(true);
         dialog.setCancelable(false);
         dialog.show();

            Thread doBind = new Thread(new Runnable(){public void run(){doBindService();}});
            doBind.start();
            break;
    }
}

так что теперь я предполагаю, что doBind происходит в другом потоке, оставляя поток пользовательского интерфейса без каких-либо других действий, кроме как показать ProgressDialogue...?

private boolean doBindService() {
 mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            mBoundService = ((myService.LocalBinder)service).getService();      
            while (mBoundService.isRunning()){
                /*wait for service to finish before doing anything else... myMethod() is expecting the sync to have completed*/
                /*I suspect this loop to be the thing causing the problem. But I'm not sure why because it is in a different thread so shouldn't interfear with the dialog?! And if that is what is causing the problem then how else can I do this?*/
            }
            /*get the activity to do Stuff with the downloaded data*/
            myMethod();
            /*finished with the service for now so unbind*/
            doUnbindService();
            if (dialog != null) {
                dialog.dismiss();
            }
        }

        public void onServiceDisconnected(ComponentName className) {
            mBoundService = null;
        }
    };

    boolean myReturn = bindService(new Intent(myActivity.this, myService.class), mConnection, Context.BIND_AUTO_CREATE);
    mIsBound = myReturn;
 return myReturn;
}

private void doUnbindService() {
    if (mIsBound) {
        unbindService(mConnection);
        mIsBound = false;
    }
}

Пожалуйста, дайте мне знать, если вам потребуется дополнительная информация, чтобы помочь мне с этой проблемой.


РЕДАКТИРОВАТЬ:

Вот код, который я использую вместо обработчика. Это показывает то же поведение (спиннер не вращается), что и раньше.

Thread doBind = new Thread(new Runnable(){
    public void run(){
        doBindService();
    }
});
doBind.start();

.

private Handler handler = new Handler() {
    @Override
public void handleMessage(Message msg) {
    dialog.dismiss();
}
};

.

private boolean doBindService() {
 mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            mBoundService = ((myService.LocalBinder)service).getService();      
            while (mBoundService.isRunning()){
            }
            //...do stuff same as before...
            handler.sendEmptyMessage(0);
        }

        public void onServiceDisconnected(ComponentName className) {
            mBoundService = null;
        }
    };

    boolean myReturn = bindService(new Intent(myActivity.this, myService.class), mConnection, Context.BIND_AUTO_CREATE);
    mIsBound = myReturn;
 return myReturn;
}

person John    schedule 17.11.2010    source источник
comment
Я вижу такое же зависание в моем диалоговом окне прогресса. Обычно это происходит, когда задача почти завершена и диалоговое окно вот-вот закроется. Как долго длится ваш диалог? Если вы заставите поток спать на несколько секунд, заставит ли это диалог вращаться?   -  person softarn    schedule 17.11.2010
comment
У меня есть аналогичная проблема с ProgressDialog, о которой я спрашивал здесь: stackoverflow.com/questions/3821306/. Я думаю, что в кодовой базе Android есть ошибка.   -  person ageektrapped    schedule 17.11.2010
comment
@softarn: Спасибо за предложение. Если я это сделаю: Thread doBind = new Thread(new Runnable(){ public void run(){ try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } doBindService(); } } ); Диалог вращается в течение 10 секунд, затем зависает на 3-4 секунды, прежде чем исчезнуть...   -  person John    schedule 17.11.2010
comment
Как сказал ageektrapped, тогда это похоже на ошибку. Прежде чем я прочитал вопрос, я действительно не заметил этого. Теперь это меня очень беспокоит :) Проблема: code.google.com/p /android/issues/detail?id=4266   -  person softarn    schedule 17.11.2010
comment
+1 за хорошо сделанный первый вопрос   -  person WarrenFaith    schedule 17.11.2010
comment
Согласен с WarrenFaith, это та информация, которую следует давать по всем достаточно сложным вопросам.   -  person I82Much    schedule 17.11.2010


Ответы (2)


Проблема со счетчиком связана с ServiceConnection, который вы создаете в новом потоке. к сожалению для вас, это будет выполняться в вашем основном потоке/потоке графического интерфейса.

Из ссылки на API: (http://developer.android.com/reference/android/content/ServiceConnection.html)

Как и многие обратные вызовы из системы, методы этого класса вызываются из основного потока вашего процесса.

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

И в качестве примечания: вы никогда не должны изменять графический интерфейс из любого потока, кроме основного потока, который вы пытаетесь сделать, создавая новый поток, который пытается закрыть диалог. Вы должны только отклонить диалог из основного потока.

person Cpt.Ohlund    schedule 17.11.2010
comment
Я изучаю ваше предложение (отправка и реакция на намерение), и на данный момент это выглядит так, как будто это ответ на мою проблему. Однако вы говорите в своем посте, что, безусловно, есть и другие способы. ... Что это за другие способы? Будет ли какой-либо из них лучшим способом сделать это? - person John; 17.11.2010
comment
Используя ваше предложение, я нашел этот пост: stackoverflow.com/questions/2843874/ и теперь иметь рабочее приложение. Спасибо за вашу помощь! - person John; 17.11.2010

Hay Можете ли вы попробовать использовать Handler?

Я думаю, вы должны сделать это, используя функцию Handler Android.

person Piyush    schedule 17.11.2010
comment
Привет. Спасибо за ваше предложение. Я попытался реализовать обработчик для этого, но я не понимаю, где должен быть вызов к нему и что он должен делать на самом деле. Моя текущая реализация по-прежнему отображает ту же проблему, что и при использовании потока. Я использовал пример, показанный на helloandroid.com/tutorials/using-threads-and -прогрессдиалог. Я отредактирую свой исходный пост и добавлю код, который я пробовал. Если бы вы могли взглянуть и увидеть, что я делаю неправильно, я буду признателен. - person John; 17.11.2010