Это мой первый пост о стеке, поэтому, пожалуйста, будьте со мной нежны! Я уверен, что то, что я пытаюсь сделать, возможно, и это то, что я сделал (или не сделал?), что вызывает проблему... Я просто не уверен, что это что-то есть.
Что я пытаюсь сделать:
Показать 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;
}