Создание AsyncTask вызывает сбой

Имея некоторые проблемы с пользовательским классом, который расширяет AsyncTask. Мое приложение предназначено для Android 4.0.3, а приведенный ниже код отлично подходит для более 30 человек, тестирующих его. Однако есть два пользователя, которые видят падение приложения, когда я вызываю новый AsyncRequest, как показано ниже.

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

Одно из двух устройств, которые испытывают этот крах, похоже, работает под управлением Android 4.0.4. Не уверен, что работает другое устройство. К сожалению, я не имею доступа к двум устройствам, поэтому не вижу выход logcat.

Любые данные о том, почему создание объекта вызывает крушение, будут с большой благодарностью.

String url = "www.google.com"; new AsyncRequest(callback, context).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url); 

И вот полный класс AsyncRequest

 public class AsyncRequest extends AsyncTask<String, String, String>{ HttpURLConnection connection; InputStream inStream; IApiCallback callback; Context context_; public AsyncRequest(IApiCallback callback, Context context) { // Log entry added for testing. Never gets called. FileLogger.getFileLogger(context).ReportInfo("Enter AsyncRequest Constructor"); this.callback = callback; context_ = context; } @Override protected String doInBackground(String... uri) { try { URL url = new URL(uri[0] + "?format=json"); FileLogger.getFileLogger(context_).ReportInfo("Async Request: Sending HTTP GET to " + url); connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); connection.addRequestProperty("Accept-Encoding", "gzip"); connection.addRequestProperty("Cache-Control", "no-cache"); connection.connect(); String encoding = connection.getContentEncoding(); // Determine if the stream is compressed and uncompress it if needed. if (encoding != null && encoding.equalsIgnoreCase("gzip")) { inStream = new GZIPInputStream(connection.getInputStream()); } else { inStream = connection.getInputStream(); } if (inStream != null) { // process response BufferedReader br = new BufferedReader(new InputStreamReader(inStream)); StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { sb.append(line); } return sb.toString(); } } catch (SocketTimeoutException e) { FileLogger.getFileLogger(context_).ReportException("Async Request: SocketTimeoutException", e); Log.i("AsyncRequest", "Socket Timeout occured"); } catch (MalformedURLException e) { FileLogger.getFileLogger(context_).ReportException("Async Request: MalformedUrlException", e); } catch (IOException e) { FileLogger.getFileLogger(context_).ReportException("Async Request: IOException", e); Log.i("doInBackground:","IOException"); if (e != null && e.getMessage() != null) { Log.i("doInBackground:",e.getMessage()); } } catch (Exception e) { FileLogger.getFileLogger(context_).ReportException("Async Request: Exception", e); } finally { if (connection != null) connection.disconnect(); } return null; } @Override protected void onPostExecute(String result) { if (result != null) FileLogger.getFileLogger(context_).ReportInfo("Async Request: Response is valid"); else FileLogger.getFileLogger(context_).ReportInfo("Async Request: Invalid response"); callback.Execute(result); } } 

EDIT: согласно комментариям ниже.

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

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

 public void GetServerInfoAsync(IApiCallback callback, Context context) throws IllegalArgumentException, Exception { if (callback == null) throw new IllegalArgumentException("callback"); if (context == null) throw new IllegalArgumentException("context"); try { FileLogger.getFileLogger(context).ReportInfo("Build URL"); String url = GetApiUrl("System/Info"); FileLogger.getFileLogger(context).ReportInfo("Finished building URL"); if (url != null) { FileLogger.getFileLogger(context).ReportInfo("GetServerInfoAsync: url is " + url); new AsyncRequest(callback, context).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, url); } else { FileLogger.getFileLogger(context).ReportError("GetServerInfoAsync: url is null"); } } catch (IllegalArgumentException iae) { FileLogger.getFileLogger(context).ReportException("GetServerInfoAsync: IllegalArgumentException", iae); throw iae; } catch (Exception e) { FileLogger.getFileLogger(context).ReportException("GetServerInfoAsync: Exception", e); throw e; } } 

Прежде всего, имейте в виду, что executeOnExecutor() недоступен до Api 11. Вы уже сказали, что проблема связана с устройством 4.0.4, но просто имейте это в виду.

Вот шаги, которые я предприму, чтобы устранить проблему. Кажется, что вы уже сделали несколько из них со всеми этими ReportInfo() .

Во-первых, я предполагаю, что ваш вызов GetServerInfoAsync находится в try...catch , правильно? Я проверяю из-за использования Throw . Кроме того, вы уже добавили регистрацию, чтобы проверить наличие ошибок с URL-адресом. Поскольку ошибки возникают до того, как вы их используете, ошибка не может быть связана с URL-адресом или любыми разрешениями в Интернете. Вы вызываете генерацию AsyncTask со ссылками на callback и context . Вы добавили протоколирование через ReportInfo() который ссылается на контекст, и те работают, да? Поэтому контекст не является вашей проблемой. Однако вы никогда не проверяете, что такое callback . Вы делаете ошибку, если она равна нулю, но вы никогда ничего не делаете с ней, прежде чем вы AsyncRequest . Попробуйте ReportInfo(callback.toString()) чтобы узнать, что это такое.

Если все остальное не работает, это может показаться ошибкой с потоковой обработкой. Почему бы не попробовать использовать только AsyncTask, а не executeOnExecutor() . Вам действительно нужно больше, чем 1 фоновый поток?

Извините, что не вернемся к этому раньше. Здесь было много проблем.

Во-первых … Благодаря предложению Вольфрама я смог поймать исключение и диагностировать, что проблема в том, что мой FileLogger (и другой класс) был статической ссылкой, и эти две таблицы не смогли найти ссылку во время выполнения. Поэтому я закончил удаление журнала с помощью моих асинхронных методов.

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

Intereting Posts
Проект библиотеки Android с помощью Android Studio Подтверждение SSL-протокола OkHttp отменено в Android Как рассчитать азимут, шаг, ориентацию, когда мое устройство Android не плоское? GCMRegistrar.getRegistrationId (this) всегда возвращает пустую строку, даже после успешного вызова для регистрации Ошибка в Spinner в всплывающем окне, при сбое Как реализовать первый запуск, например, приложения для Android Lollipop: например, «Таблицы», «Слайды»? Тестирование модуля Android MVP – должен ли я высмеять шину событий? Как нарисовать гладкий градиент на холсте в Android Как загрузить HTML-файл, размещенный в приложении, с помощью Phonegap Удалить sms android после получения Без задержки Показать панель инструментов после скрытия путем прокрутки по нажатию кнопки Retrofit преобразует массив объектов в GSON Error Почему я получаю исключение из null-указателя, хотя значение value отображается при печати? ViewPager вложен в ViewPager Какое разрешение необходимо добавить для добавления контакта?