AsyncTask долго соображает в одном Активити

Рейтинг: 1Ответов: 1Опубликовано: 28.09.2014

Добрый день!
Столкнулся с проблемой, которую никак не могу решить, да и странная она.

У меня есть свой написанный класс SendDate, который я использую для отправки данных на сервер.

В нем есть процедура Send(), которая, собственно, и производит отправку данных. Вот как это выглядит:

public void Send(String process)
    {
        processing = process;
        new SendParamToURL(callBackSend, URL, process).execute(ListParam);
    }
// ОТПРАВКА ДАННЫХ
    static class SendParamToURL extends AsyncTask<ArrayList<SendParam>, String, String>
    {
        private CallBackSendDate listener;
        private String URL;
        private String processing;
        public SendParamToURL(CallBackSendDate listener, String URL, String process){
            this.listener = listener;
            this.URL = URL;
            this.processing = process;
        }
        //@TargetApi(Build.VERSION_CODES.FROYO)
        @Override
        protected String doInBackground(ArrayList<SendParam>... params)
        {
            try
            {
                DefaultHttpClient hc = new DefaultHttpClient();
                ResponseHandler<String> res = new BasicResponseHandler();
                //он у нас будет посылать post запрос
                HttpPost postMethod = new HttpPost(this.URL);
                //будем передавать два параметра
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(params[0].size());
                //передаем параметры из наших текстбоксов
                for(SendParam info : params[0])
                {
                    nameValuePairs.add(new BasicNameValuePair(info.name, info.value));
                }
                //собераем их вместе и посылаем на сервер
                postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs, "UTF-8"));
                //получаем ответ от сервера
                String response = hc.execute(postMethod, res);
                return response.toString();
            } catch (Exception e) {
                System.out.println("Exp=" + e);
                //listener.onError(e.toString());
            }
            return "";
        }
        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
        }
        @Override
        protected void onPostExecute(String result)
        {
            listener.onReturnAnswer(result);
            super.onPostExecute(result);
        }
        @Override
        protected void onPreExecute()
        {
            listener.onSend(processing);
            super.onPreExecute();
        }
    }

Вот, собственно, как я отправляю данные:

public static SendDate SendDateURL;
....
SendDateURL = new SendDate();
SendDateURL.initialize(Url, sendDateCallBack);
...
SendDateURL.ClearParam();
SendDateURL.AddParam("Param1", Value1);
SendDateURL.AddParam("Param2", Value2);
SendDateURL.Send("");

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

public SendParamToURL(CallBackSendDate listener, String URL, String process)

Дальше идет какое-то провисание по времени, секунд 10-15, а иногда и больше, и уже после мы попадаем в процедуру:

protected String doInBackground(ArrayList<SendParam>... params)

Причем это происходит только на одной активити, на всех остальных все прекрасно!
Единственное, что их может отличать, - то, что эта активити создана после обновления Android Studio до версии 0.8.11, больше разницы никакой. Откуда это провисание по времени, не понятно.

Кто сталкивался с данными проблемами?

Ответы

▲ 1

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