Vamos fazer a conexão com o Web Service para podermos fazer a busca pelo nome ou cidade da academia.
Abra o arquivo build.grandle (Module: app). Vamos adicionar a biblioteca Gson nas dependências.
1 2 3 4 5 6 7 8 9 10 |
dependencies { implementation fileTree(<strong>dir</strong>: <strong>'libs'</strong>, <strong>include</strong>: [<strong>'*.jar'</strong>]) implementation <strong>'androidx.appcompat:appcompat:1.0.2' </strong>implementation <strong>'androidx.constraintlayout:constraintlayout:1.1.3' </strong>testImplementation <strong>'junit:junit:4.12' </strong>androidTestImplementation <strong>'androidx.test.ext:junit:1.1.0' </strong>androidTestImplementation <strong>'androidx.test.espresso:espresso-core:3.1.1' </strong><em>//gson </em>implementation <strong>'com.google.code.gson:gson:2.8.5' </strong>} |
Depois de digitar clique em Sync Now.
Crie uma nova classe chamada AcademiaCidade no pacote model.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package br.com.micheladrianomedeiros.ondetreinar.model; public class AcademiaCidade { private Long id; private String nome; private String cidade; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getCidade() { return cidade; } public void setCidade(String cidade) { this.cidade = cidade; } @Override public String toString() { return "AcademiaCidade{" + "id=" + id + ", nome='" + nome + '\'' + ", cidade='" + cidade + '\'' + '}'; } } |
Crie uma classe chamada HTTPService no pacote remote.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
package br.com.micheladrianomedeiros.ondetreinar.remote; import android.os.AsyncTask; import android.util.Log; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.io.IOException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import br.com.micheladrianomedeiros.ondetreinar.model.AcademiaCidade; public class HTTPService extends AsyncTask<Void, Void, List<AcademiaCidade> > { private final String word; public HTTPService(String word){ this.word = word; } @Override protected List<AcademiaCidade> doInBackground(Void... voids) { List<AcademiaCidade> lista= new ArrayList<>(); try { //URL url = new URL("http://192.168.1.113:8080/academia/"+word); URL url = new URL("https://academiablack.herokuapp.com/academia/"+word); Log.i("url ",url.getHost()); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("Accept","application/json"); connection.setConnectTimeout(15000); connection.connect(); StringBuilder resposta = new StringBuilder(); Scanner scanner = new Scanner(url.openStream()); while(scanner.hasNext()){ resposta.append(scanner.next()); } TypeToken<List<AcademiaCidade>> token = new TypeToken<List<AcademiaCidade>>() {}; Gson gson = new Gson(); lista = gson.fromJson(String.valueOf(resposta), token.getType()); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return lista; } } |
Por algum motivo que ainda não descobri, quando executo o web service localmente funciona e quando tento capturar as informações do web service no Heroku dá erro.
1 |
2019-12-28 14:42:52.765 12733-12816/br.com.micheladrianomedeiros.ondetreinar W/System.err: java.net.UnknownHostException: Unable to resolve host "academiablack.herokuapp.com": No address associated with hostname |
No activity_main.xml eu adicionei um TextView.
1 2 3 4 |
<TextView android:id="@+id/teste" android:layout_width="fill_parent" android:layout_height="wrap_content" /> |
Abra o arquivo AndroidManifest.xml para adicionarmos a permissão de acesso a internet.
Na verdade fiz vários testes, para ver se conseguia acessar o web service no Heroku, então vou deixar a configuração completa.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="br.com.micheladrianomedeiros.ondetreinar"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:usesCleartextTraffic="true" android:theme="@style/AppTheme"> <activity android:name=".ReviewList"></activity> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> |
Vou deixar também a programação completa do arquivo MainActivity.java.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
package br.com.micheladrianomedeiros.ondetreinar; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.StrictMode; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import java.util.List; import java.util.concurrent.ExecutionException; import br.com.micheladrianomedeiros.ondetreinar.model.AcademiaCidade; import br.com.micheladrianomedeiros.ondetreinar.remote.HTTPService; public class MainActivity extends AppCompatActivity { private static final int MENU_GET_REVIEWS = Menu.FIRST; private Spinner spinnerTypesGym; private Button buttonSearchGym; private EditText editTextSearchGym; private TextView editTextTeste; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextSearchGym = findViewById(R.id.search_gym); spinnerTypesGym = findViewById(R.id.spinner_type_gym); buttonSearchGym = findViewById(R.id.button_search_gym); buttonSearchGym.setOnClickListener(buttonClickListener); editTextTeste = findViewById(R.id.teste); StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); } private View.OnClickListener buttonClickListener = new View.OnClickListener() { @Override public void onClick(View v) { switch (v.getId()) { case R.id.button_search_gym: boolean b = handleSearch(); if (b) { listaDeAcademias(); } break; case View.NO_ID: default: Log.i("erro", "nada"); break; } } }; private void listaDeAcademias(){ HTTPService service = new HTTPService(editTextSearchGym.getText().toString()); try { List<AcademiaCidade> retorno = service.execute().get(); Log.i("retorno ", String.valueOf(retorno.size())); editTextTeste.setText(retorno.toString()); } catch (ExecutionException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } private boolean handleSearch() { if ((editTextSearchGym.getText() == null) || editTextSearchGym.getText().toString().equals("")) { new AlertDialog.Builder(this).setTitle(R.string.alert_label). setMessage(R.string.location_not_supplied_message). setPositiveButton("Continue", new android.content.DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int arg1) { // Just close alert. } }).show(); return false; } return true; } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, this.MENU_GET_REVIEWS, 0, R.string.menu_get_reviews).setIcon( android.R.drawable.ic_menu_more); return true; } public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_GET_REVIEWS: Intent intent = new Intent(this, ReviewList.class); startActivity(intent); return true; } return false; } } |
Executando localmente funciona. Quando eu descobrir porquê não funciona no Heroku eu atualizo a informação aqui ou nos próximos artigos.
Voltando três meses depois deste artigo, refiz o projeto porque não achei no meu pc o antigo.
Agora está funcionando a chamada para o servidor do Heroku. Contudo, não apenas refiz o projeto como estou executando em uma rede sem proxy e também direto do celular.
O resultado deu bom.
Deixe um comentário