doInBackground вызывает AsyncTask, затем блокирует поток пользовательского интерфейса блоков - PullRequest
4 голосов
/ 16 ноября 2011

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

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

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

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

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

            }   
        }

Код для 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)

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

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

Ответы [ 3 ]

0 голосов
/ 16 ноября 2011

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

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

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

0 голосов
/ 16 ноября 2011

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

все, что вам нужно сделать, - это ввести код поиска в 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

            }   
        }
0 голосов
/ 16 ноября 2011

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

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