Comunicação com o servidor
Nesse capitulo nos iremos ver como realizar uma comunicação com um servidor remoto e como utilizar a classe AsyncTask para realizar essa tarefa.
Primeiro vamos ver como funciona a classe AsyncTask.
Conhecendo o AsyncTask e realizando comunicação com o servidor.
Vamos ver agora como funciona a classe AsyncTask, a classe AsyncTask é uma classe utilizada para execução de tarefas em segundo plano. O AsyncTask possui alguns metodos principais, que são eles:
onPreExecute() - Ele é o primeiro metodo a ser executado quando executamos a nossa AsyncTask.
doInBackground() - Ele é chamado apos o onPreExecute ser finalizado, é nele que colocaremos todos as tarefas para serem executadas em background.
onPostExecute() - Esse metodo é chamado quando o doInBackground é finalizado, e é nesse metodo que iremos trabalhar com os dados de retorno do nosso doInBackground, ou seja, se baixamos uma imagem no doInBackground no metodo onPostExecute é onde iremos receber os nossos bytes da imagem e exibir no imageview.
Primeiro vamos adicionar a biblioteca do recycleView no nosso projeto.
Vamos adicionar ao nosso AndroidManifest.xml a permissão de conexão com a internet.
<uses-permission android:name="android.permission.INTERNET"/>
Vamos adicionar e realizar algumas alterações de layout para utilizar no nosso projeto.
Vamos realizar as seguintes alterações na activity_main.xml
Vamos adicionar o layout de detalhes de filme do nosso projeto
Agora vamos criar o layout do nosso item do recycleView
Agora vamos criar o layout da nossa tela de configurações que iremos utilizar o sharedPreferences nela.
Vamos adicionar um arquivo de menu no nosso projeto, esse menu ira abrir a nossa tela de configurações
Agora vamos criar uma classe que sera responsavel por armazenar as nossas URL's que iremos requisitar ao servidor. Nesse projeto irei utilizar 3 serviços da API (https://developers.themoviedb.org/3/getting-started), os serviços são:
Recuperar os filmes atuais em exibição - https://api.themoviedb.org/3/movie/now\_playing?api\_key=164cc22d93959f1d405f7dbe79f326a9&language=pt-BR&page=1
Recuperar os detalhes do filme - https://api.themoviedb.org/3/movie/329865?api\_key=164cc22d93959f1d405f7dbe79f326a9&language=pt-BR /react-text
Enviar uma avaliação para o filme - https://api.themoviedb.org/3/movie/329865/rating?api\_key=164cc22d93959f1d405f7dbe79f326a9&guest\_session\_id=e133a5fe0f2ae48524c34700bd689239
Agora nos temos que criar duas classes, uma classe vai ser responsavel por armazenar todos os atributos da listagem dos filmes e a outra classe vai ser responsavel por armazenar todos os atributos de detalhes do filme. Nos iremos utilizar esse site (http://www.jsonschema2pojo.org ou http://pojo.sodhanalibrary.com) para transformar o nosso json que retorna do servidor em uma classe .java. Irei apenas capturas alguns atributos que achei importante para avançar no projeto.
Agora vamos criar a classe responsavel por gerencia o nosso SharedPreferences.
Agora vamos adicionar a classe que vai ser responsavel pelo nosso layout de activity_configuração, nessa classe no onClick do botão de salvar nos iremos salvar no shredPreferences qual foi a opção marcada pelo usuario, e iremos criar tambem uma verificação para caso o usuario volte a essa tela, ja aparecer marcado qual foi a opção que ele escolheu.
Agora vamos realizar algumas alterações no nosso projeto antes de começar a utilizar o asyncTask e começar as requisições no servidor. Vamos agora criar um ENUM que sera responsavel por ter os metodos de request HTTP do servidor.
Vamos agora criar a interface do nosso RecycleView para implementar a função do onClick
Agora vamos criar o adapter do nosso RecycleView.
Vamos agora criar uma classe chamada Uteis, essa classe vai possuir apenas dois metodos, um deles vai transformar os bytes de retorno do servidor em uma String e o segundo metodo vai baixar a imagem do filme.
Agora vamos voltar a nossa MainActivity e vamos realizar as seguintes alterações. Na nossa MainActivity é onde iremos criar uma classe que ira herdade de AsyncTask.
Na declaração da nossa asynctask nos temos que informar os seguintes parametros <Parametro de entrada para chamar a nossa asynctask, indicativo de progresso da nossa requisição(quando não queremos utilizar esse parametros nos colocamos void), parametro de retorno da nossa asynctask>, apos colocar esses 3 parametros da nossa classe vamos realizar o overrride nos nossos metodo doInBackground, onPreExecute e onPostExecute. Para executar uma classe do tipo asyncTask basta criar ela onde voce quer chamar e chamar um metodo chamado execute(), esse metodo execute() recebe como tipo de parametro o primeiro parametro que colocamos na declaração da asyncTask.
O Metodo verifyShared verifica a opção em que o usuario marcou na tela de configurações, se ele tiver marcado como sim, assim que o usuario abrir a nossa app vai ser realizado a chamado ao servidor.
Agora vamos para nossa classe getMovies, que é a responsavel por implementar o nosso asyncTask e realizar a chamada no servidor.
No metodo onPreexecute estou abrindo um ProgressDialog para mostrar ao usuario que estou realizando alguma atividade e pedi para ele esperar um pouco.
No metodo doInBackground estou abrindo a minha conexão com o servidor, essa conexão é uma conexão com o protocolo Http GET, apos abrir a minha conexão com o servidor estou verificando a resposta do servidor para saber o codigo HTTP que ele retornou, se foi OK ou não, se tiver sido OK, eu transformo os bytes que o servidor me retornou e transformo em uma string atraves do metodo Uteis.bytesParaString. Apos isso irei transformar a minha string em um objeto do tipo Json para preencher o meu objeto de filmes atraves do metodo convertJsonToMovie.
No Metodo convertJsonToMovies irei criar as minhas variaveis de acordo com o tipo de estrutura Json que o servidor me retornar. Se ele me retornar um json no formato de array, irei utilizar o objeto JSONArray, se o servidor me retornar um json no formato de objeto irei utilizar o objeto JSONObject.
Agora vamos criar a nossa acitivty de detalhes do filme, para quando o usuario clicar em algum item da lista ele ser direcionado para a tela de detalhes, nessa activity nos iremos ter dois AsyncTask, um asynctask ira realizar a operação de enviar um POST para o servidor, e o outro asyncTask ira enviar um GET para o servidor.
O Metodo getDetailMovie é identico a da activity MainActiivty que retorna a lista de filmes, a diferença esta em seu tratamento do json, que estamos tratando apenas um objeto Json com alguns objetos JSONArray dentro dele.