DoInBackground вызов AsyncTask затем спит блоки UI Thread

У меня есть активность, состоящая из AsyncTask, направленная на запуск запроса, когда пользователь нажимает кнопку. Я искал ответы, но я не нашел той же проблемы, или это не то же самое для меня. Код делает то, что я хочу, но ProgressDialog выглядит заблокированным, поскольку счетчик не поворачивается иногда (почти все время).

Когда я нажимаю на кнопку:

AsyncTask запущен -> showDialog () вызывается onPreExecute -> startSearch (SearchManager запускает новую AsyncTask, а в doInBackground происходит тяжелый вызов с сетью) -> doInBackground в Activity ожидает загрузки SearchManager -> отображения.

Код для кнопки:

button_search.setOnClickListener(new OnClickListener() { public void onClick(View v) { new SearchTask().execute(); } }); 

Код для AsyncTask в активности поиска:

 private class SearchTask extends AsyncTask<Void,Void,Void>{ @Override protected void onPreExecute(){ showDialog(DIALOG_LOADING_ID); searchManager.startSearch(); } @Override protected Void doInBackground(Void... params) { while(searchManager.isLoading()){ try {Thread.sleep(150);} catch(Exception e){}; } return null; } @Override protected void onPostExecute(Void ret){ try {dismissDialog(DIALOG_LOADING_ID);} catch (Exception e){}; if ( searchManager.errorOccurred() ){ //Error } else { //No Error } } в private class SearchTask extends AsyncTask<Void,Void,Void>{ @Override protected void onPreExecute(){ showDialog(DIALOG_LOADING_ID); searchManager.startSearch(); } @Override protected Void doInBackground(Void... params) { while(searchManager.isLoading()){ try {Thread.sleep(150);} catch(Exception e){}; } return null; } @Override protected void onPostExecute(Void ret){ try {dismissDialog(DIALOG_LOADING_ID);} catch (Exception e){}; if ( searchManager.errorOccurred() ){ //Error } else { //No Error } } 

Код для SearchManagerAsyncTask: который запускается непосредственно с помощью startSearch

 protected class SearchAsync extends AsyncTask <Void,Void,Void>{ @Override protected Void doInBackground(ComSearchAds... datas) { global.getDataManager().doSearch(); //... When finished setIs_loading(false); } } 

Я, видимо, делаю что-то неправильно, но не могу найти, что и как избежать этого. Спасибо за вашу помощь !

РЕШЕНИЕ :

Наконец, похоже, что не вращающийся ProgressDialog был потому, что я использовал тот же экземпляр ProgressDialog и

 showDialog(DIALOG_LOADING_ID); //doInBackground dismissDialog(DIALOG_LOADING_ID); 

Используется с причинами проблемы, я изменился на

 removeDialog(DIALOG_LOADING_ID) 

И теперь он работает нормально.

Спасибо всем, и надеюсь, что когда-нибудь он поможет кому-нибудь!

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

Все, что вам нужно сделать, это поместить вас в поисковую задачу cod ein doInbackGround (). например

 @Override protected Void doInBackground(Void... params) { global.getDataManager().doSearch(); return null; } 

Также используйте переменную уровня класса, чтобы получить результат поиска для хранения true / false

 @Override protected void onPostExecute(Void ret){ // Set you result here setIs_loading(my_searh_result); try {dismissDialog(DIALOG_LOADING_ID);} catch (Exception e){}; if ( searchManager.errorOccurred() ){ //Error } else { //No Error } } 

Не могли бы вы попытаться добавить элемент управления ProgressBar в свой файл макета и установить значение Visible в true при запуске async-задачи и установить, когда он достигнет конца процесса. Ниже приведен код для него.

 <ProgressBar android:layout_width="wrap_content" android:id="@+id/progressBar1" android:layout_height="wrap_content"></ProgressBar> 

Трудно сказать, но попробуйте это для onClickListner:

 button_search.setOnClickListener(new OnClickListener() { public void onClick(View v) { new SearchTask().execute(); setIs_loading(true); searchManager.startSearch(); } }); 

Это довольно дикая догадка, но это может сработать