У меня есть функция, которая выполняет запрос к REST API, который использует httpPost. Поэтому после того, как с помощью некоторых пары имени и UrlEncodedFormEntity магии, чтобы настроить все, у меня есть этот код:Множество функций, связанных с сетевыми операциями
try {
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
// parsing the response here
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Это был первоначально введен в функцию (публичный String), где он использует реакцию REST API, чтобы возвращать токен доступа. Эта функция живет в классе, который используется только для связи с API. Из моей основной деятельности я создаю экземпляр этого класса, а затем звоню:
String accesstoken = ApiHandler.login();
От MainActivity. Этот токен доступа должен делать что-либо еще в приложении, поэтому это нужно сделать до того, как приложение сможет продолжить работу. Я передаю контекст приложения ApiHandler, чтобы иметь возможность показывать сообщения с тостами и AlertDialogs из класса ApiHandler. Тем не менее, у меня есть несколько вопросов сейчас:
Как я могу сохранить экран на progressdialog, который был вызван из функции входа в ApiHandler, пока у меня нет accesstoken? Я попытался использовать Thread, но связь между потоком, функцией входа в систему и основным действием пользовательского интерфейса, которая вызывает функцию входа в систему, кажется, требует большой работы. Кроме того, и что более важно, мне требуется использовать thread.join(), потому что приложение ничего не может сделать, если у него нет токена доступа, который задается login(). Logcat говорит мне, что это, кажется, замораживает пользовательский интерфейс, так как я получаю сообщение о том, что он пропускает от 30 до 50 кадров, и что-то может блокировать поток пользовательского интерфейса.
Другая проблема заключается в том, что у ApiHandler много функций, потому что API имеет множество разных вызовов, поэтому что-то вроде AsyncTask сделает код нечитаемым, так как это приведет к большому количеству Asynctasks, и каждая функция возвращает разные типы данные. Написание всей Asynctask для каждой функции в ApiHandler, а также ее собственный doInBackground, onPostExecute и onPreExecute сделали бы намного сложнее, чем должно быть.
Так какой же самый простой способ запускать код из класса неактивности, который требует сетевых подключений без замораживания потока пользовательского интерфейса, и ответ на него должен быть фактически синхронным, так как множество операций в приложении может " t выполняется асинхронно и не загромождает код, когда у меня есть 150 функций для разных вызовов API, каждый со своей собственной функцией.
Потребовалось некоторое время, чтобы понять, как ДООСНАСТКЕ работает, но я, наконец, получил его и работает, и он делает прекрасную работу и делает код очень чистым! Спасибо! – aDev