2014-10-17 2 views
0

У меня есть функция, которая выполняет запрос к 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, каждый со своей собственной функцией.

ответ

0

Используйте некоторые android lib для асинхронной HTTP-операции. Retrofit from sqaure Удивительный.

Из Retrofit документации

Он использует аннотации для описания запроса HTTP:

  • URL замены параметров и параметров запроса поддержки преобразования
  • объекта в теле запроса (например,, JSON, протокольные буферы)
  • Multipart тело запроса и файл загрузить

Пример кода

public interface GitHubService { 
    @GET("https://stackoverflow.com/users/{user}/repos") 
    List<Repo> listRepos(@Path("user") String user); 
} 


RestAdapter restAdapter = new RestAdapter.Builder() 
    .setEndpoint("https://api.github.com") 
    .build(); 

GitHubService service = restAdapter.create(GitHubService.class); 


List<Repo> repos = service.listRepos("octocat"); 
+0

Потребовалось некоторое время, чтобы понять, как ДООСНАСТКЕ работает, но я, наконец, получил его и работает, и он делает прекрасную работу и делает код очень чистым! Спасибо! – aDev

Смежные вопросы