Aula android 05

91
sábado, 17 de novembro de 12

Transcript of Aula android 05

Page 1: Aula android 05

sábado, 17 de novembro de 12

Page 3: Aula android 05

Integração com webservice

Testes unitários

JSON

Testes funcionais

Fragments

sábado, 17 de novembro de 12

Page 4: Aula android 05

JSON

sábado, 17 de novembro de 12

Page 5: Aula android 05

JSON

{ "Aluno" : [ { "nome": "João", "notas": [ 8, 9, 7 ] }, { "nome": "Maria", "notas": [ 8, 10, 7 ] }, { "nome": "Pedro", "notas": [ 10, 10, 9 ] } ]}

JSON (com a pronúncia ['dʒejzən]), um acrônimo para "JavaScript Object Notation", é um formato leve para intercâmbio de dados computacionais.

Wikipedia

sábado, 17 de novembro de 12

Page 6: Aula android 05

Vamos imaginar uma classe “Funcionario”

sábado, 17 de novembro de 12

Page 7: Aula android 05

Exemplo

public class Funcionario {

private String nome; private String endereco; private Date dataNascimento;

sábado, 17 de novembro de 12

Page 8: Aula android 05

sábado, 17 de novembro de 12

Page 9: Aula android 05

E agora gostaria de transforma-la em JSON.

Como?sábado, 17 de novembro de 12

Page 10: Aula android 05

Jackson

http://jackson.codehaus.org/sábado, 17 de novembro de 12

Page 11: Aula android 05

Como adicionar a biblioteca?

sábado, 17 de novembro de 12

Page 12: Aula android 05

sábado, 17 de novembro de 12

Page 13: Aula android 05

sábado, 17 de novembro de 12

Page 14: Aula android 05

sábado, 17 de novembro de 12

Page 15: Aula android 05

{"dataNascimento":60536862000000, "endereco":"Rua tal", "nome":"João"}

Json de um funcionário

sábado, 17 de novembro de 12

Page 16: Aula android 05

Json de uma lista de funcionários

[{"dataNascimento":60536862000000, "endereco":"Rua tal", "nome":"João"}, {"dataNascimento":58038951600000, "endereco":"Rua teste", "nome":"Maria"}]

sábado, 17 de novembro de 12

Page 17: Aula android 05

Como implementar?

sábado, 17 de novembro de 12

Page 18: Aula android 05

Vamos utilizar a classe ObjectMapper do

Jackson

sábado, 17 de novembro de 12

Page 19: Aula android 05

A classe ObjectMapper nos dará as ferramentas

necessárias para gerar um json a partir de uma

instância de um objeto ou gerar um objeto a partir de

um json

sábado, 17 de novembro de 12

Page 20: Aula android 05

Para gerar um JSON a partir de um objeto precisamos chamar o método

writeValueAsString.

sábado, 17 de novembro de 12

Page 21: Aula android 05

String writeValueAsString(Object value)

sábado, 17 de novembro de 12

Page 22: Aula android 05

Exemplo

Funcionario funcionario01 = new Funcionario("João", "Rua tal", new Date(1988, 4, 3));ObjectMapper mapper = new ObjectMapper();try { System.out.println(mapper.writeValueAsString(funcionario01);} catch (Exception e) { e.printStackTrace();}

sábado, 17 de novembro de 12

Page 23: Aula android 05

{"dataNascimento":60536862000000, "endereco":"Rua tal", "nome":"João"}

output

sábado, 17 de novembro de 12

Page 24: Aula android 05

E uma lista de funcionários, como

ficaria?

sábado, 17 de novembro de 12

Page 25: Aula android 05

ExemploFuncionario funcionario01 = new Funcionario("João", "Rua tal", new Date(1988, 4, 3));Funcionario funcionario02 = new Funcionario("Maria", "Rua teste", new Date(1909, 2,

List<Funcionario> funcionarios = new ArrayList<Funcionario>();funcionarios.add(funcionario01);funcionarios.add(funcionario02);

ObjectMapper mapper = new ObjectMapper();try { System.out.println(mapper.writeValueAsString(funcionarios));} catch (Exception e) { e.printStackTrace();}

sábado, 17 de novembro de 12

Page 26: Aula android 05

output

[{"dataNascimento":60536862000000, "endereco":"Rua tal", "nome":"João"}, {"dataNascimento":58038951600000, "endereco":"Rua teste", "nome":"Maria"}]

sábado, 17 de novembro de 12

Page 27: Aula android 05

Beleza?

sábado, 17 de novembro de 12

Page 28: Aula android 05

Vamos imaginar agora uma classe Pagamento

sábado, 17 de novembro de 12

Page 29: Aula android 05

Exemplo

public class Pagamento { private Funcionario funcionario; private Double valor;

sábado, 17 de novembro de 12

Page 30: Aula android 05

Pagamento pagamento01 = new Pagamento(funcionario01, 100.0);try { System.out.println(mapper.writeValueAsString(pagamento01));} catch (Exception e) { e.printStackTrace();}

Código

sábado, 17 de novembro de 12

Page 31: Aula android 05

output - Pagamento

{"funcionario":{ "dataNascimento":60536862000000,

"endereco":"Rua tal", "nome":"João" }, "valor":100.0}

sábado, 17 de novembro de 12

Page 32: Aula android 05

Vamos criar uma lista de Pagamentos

sábado, 17 de novembro de 12

Page 33: Aula android 05

Código

List<Pagamento> pagamentos = new ArrayList<Pagamento>(); pagamentos.add(pagamento01); pagamentos.add(pagamento02); try { System.out.println(mapper.writeValueAsString(pagamentos)); } catch (Exception e) { e.printStackTrace(); }

sábado, 17 de novembro de 12

Page 34: Aula android 05

output - Lista de Pagamentos

[{"funcionario":{ "dataNascimento":60536862000000, "endereco":"Rua tal", "nome":"João"}, "valor":100.0 },{"funcionario":{

"dataNascimento":58038951600000, "endereco":"Rua teste",

"nome":"Maria"}, "valor":1560.3 }]

sábado, 17 de novembro de 12

Page 35: Aula android 05

sábado, 17 de novembro de 12

Page 36: Aula android 05

Como podemos fazer o inverso?

sábado, 17 de novembro de 12

Page 37: Aula android 05

Ler um JSON e transformar em objeto.

sábado, 17 de novembro de 12

Page 38: Aula android 05

Para isso usamos o método readValue

sábado, 17 de novembro de 12

Page 39: Aula android 05

Object ReadValue(String, Class)

sábado, 17 de novembro de 12

Page 40: Aula android 05

Exemplo

ObjectMapper mapper = new ObjectMapper();try { String json = "{\"dataNascimento\":60536862000000,\"endereco\":\"Rua tal\",\"nome\":\"João\"}"; Funcionario funcionario = mapper.readValue(json, Funcionario.class); System.out.println("funcionario: " + funcionario.getNome());} catch (Exception e) { e.printStackTrace();}

sábado, 17 de novembro de 12

Page 41: Aula android 05

Webservice

sábado, 17 de novembro de 12

Page 42: Aula android 05

Requesthttp://www.teste.com/pegarClientes

Capturando dados

sábado, 17 de novembro de 12

Page 43: Aula android 05

Response

sábado, 17 de novembro de 12

Page 44: Aula android 05

Request

http://www.teste.com/pegarClientes?dataUpdate=01012010

sábado, 17 de novembro de 12

Page 45: Aula android 05

Response

sábado, 17 de novembro de 12

Page 46: Aula android 05

Exemplo

HttpClient httpclient = new DefaultHttpClient();HttpPost httpPost = new HttpPost("URL");try { List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("parametro", "valor"));

httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httpPost); System.out.println("response code: " + response.getStatusLine().getStatusCode()); System.out.println("texto: " + EntityUtils.toString(response.getEntity())); } catch (Exception e) { e.printStackTrace();}

sábado, 17 de novembro de 12

Page 47: Aula android 05

Testes automatizados

sábado, 17 de novembro de 12

Page 48: Aula android 05

Porque testar?

sábado, 17 de novembro de 12

Page 49: Aula android 05

sábado, 17 de novembro de 12

Page 50: Aula android 05

Alguns tipos de teste

• Teste unitário

• Teste funcional

• Teste de integração

• Teste de stress

sábado, 17 de novembro de 12

Page 51: Aula android 05

Alguém conhece?

sábado, 17 de novembro de 12

Page 52: Aula android 05

Usa?sábado, 17 de novembro de 12

Page 53: Aula android 05

Teste unitário

JUnit

sábado, 17 de novembro de 12

Page 54: Aula android 05

TDD (Test drive-development)

sábado, 17 de novembro de 12

Page 55: Aula android 05

Desenvolvimento orientado a testes

sábado, 17 de novembro de 12

Page 56: Aula android 05

Caminho a seguir

sábado, 17 de novembro de 12

Page 57: Aula android 05

Passos de bebê

sábado, 17 de novembro de 12

Page 58: Aula android 05

Vamos lá

sábado, 17 de novembro de 12

Page 59: Aula android 05

DOJO

http://carloscavalcanti.com/2010/08/23/o-que-e-coding-dojo/

sábado, 17 de novembro de 12

Page 60: Aula android 05

Três momentos:

1. o Vermelho: Quando um ou mais testes não estão passando. Adupla que está de “posse” do computador deve fazer o teste passar e aplatéia não deve falar neste momento, para não atrapalhar.

2. o Verde: Quando os testes são rodados e os mesmos passados,aí sim, neste momento a platéia poderá dar sugestões para melhor ocódigo.

3. o Amarelo: Resumindo, refatoração. Após a platéia darsugestões de modificações.

sábado, 17 de novembro de 12

Page 61: Aula android 05

http://dojopuzzles.com/problemas/exibe/jokenpo/

sábado, 17 de novembro de 12

Page 62: Aula android 05

Criando o projeto de teste

sábado, 17 de novembro de 12

Page 63: Aula android 05

Padrão: nomeProjeto+Test

sábado, 17 de novembro de 12

Page 64: Aula android 05

Selecionando projeto Target

sábado, 17 de novembro de 12

Page 65: Aula android 05

Teste funcional

Robotium

http://code.google.com/p/robotium/

sábado, 17 de novembro de 12

Page 66: Aula android 05

Criando projeto para teste

sábado, 17 de novembro de 12

Page 67: Aula android 05

sábado, 17 de novembro de 12

Page 68: Aula android 05

Adicionar no manifest do projeto de teste

<instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.exemplorobotium" />

sábado, 17 de novembro de 12

Page 69: Aula android 05

Classe Solo

sábado, 17 de novembro de 12

Page 70: Aula android 05

Exemplo

public class TestRobotium extends ActivityInstrumentationTestCase2<MainActivity>{ private Solo solo;

public TestRobotium() { super("com.example.exemplorobotium", MainActivity.class); } public void setUp() throws Exception { solo = new Solo(getInstrumentation(), getActivity()); }

sábado, 17 de novembro de 12

Page 71: Aula android 05

public void testBotaoDaSegundaTela() { assertTrue(solo.searchText("Testando")); solo.clickOnButton(0); solo.enterText(0, "Olá"); solo.clickOnButton(0); assertTrue(solo.searchText("Olá")); solo.sleep(2000); solo.clearEditText(0); solo.enterText(0, "Teste 01"); solo.clickOnButton(0); assertTrue(solo.searchText("Teste 01")); solo.sleep(2000); solo.clearEditText(0); solo.enterText(0, "ABC!"); solo.clickOnButton(0); assertTrue(solo.searchText("ABC!")); }

sábado, 17 de novembro de 12

Page 72: Aula android 05

Fragments

sábado, 17 de novembro de 12

Page 73: Aula android 05

Como desenvolver layouts que sejam facilmente portados para smartphones e

tablets?

sábado, 17 de novembro de 12

Page 74: Aula android 05

Fragmento

sábado, 17 de novembro de 12

Page 75: Aula android 05

sábado, 17 de novembro de 12

Page 76: Aula android 05

sábado, 17 de novembro de 12

Page 77: Aula android 05

Disponibilidade

Horneycomb

Ice Cream Sandwich

sábado, 17 de novembro de 12

Page 78: Aula android 05

Android inferiores ao 3.0...

sábado, 17 de novembro de 12

Page 79: Aula android 05

Adicionamos a lib

Android-support-4

sábado, 17 de novembro de 12

Page 80: Aula android 05

sábado, 17 de novembro de 12

Page 81: Aula android 05

Por onde começar?

sábado, 17 de novembro de 12

Page 82: Aula android 05

Criando alguns “fragmentos”

sábado, 17 de novembro de 12

Page 83: Aula android 05

Criar 3 layouts e em cada um inserir um textView

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:orientation="vertical" >

<TextView android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Frag 1" android:textColor="#000000" android:textSize="18sp" android:textStyle="bold" />

</LinearLayout>

sábado, 17 de novembro de 12

Page 84: Aula android 05

Para cara fragment devemos criar uma classe que extenda de Fragment

public class Fragment1 extends Fragment {

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment1, null); TextView text = (TextView) view.findViewById(R.id.text1); text.setText("Fragment 1"); return view; }

}

sábado, 17 de novembro de 12

Page 85: Aula android 05

public class Fragment2 extends Fragment {

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment2, null); TextView text = (TextView) view.findViewById(R.id.text2); text.setText("Fragment 2"); setRetainInstance(true); return view; } public void setTexto(String msg) { View view = getView(); if (view != null) { TextView text = (TextView) view.findViewById(R.id.text2); text.setText(msg); } }}

sábado, 17 de novembro de 12

Page 86: Aula android 05

public class Fragment3 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment3, null); TextView text = (TextView) view.findViewById(R.id.text3); text.setText("Fragment 3"); return view; }}

sábado, 17 de novembro de 12

Page 87: Aula android 05

E para juntarmos os fragments

Usamos uma classe que extenda de

FragmentActivity

E criamos um arquivo XML para juntar esses fragments

sábado, 17 de novembro de 12

Page 88: Aula android 05

main_fragments.xml

sábado, 17 de novembro de 12

Page 89: Aula android 05

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_fragments); } @Override public boolean onCreateOptionsMenu(android.view.Menu menu) { menu.add(0, 0, 0, "Alterar do Fragment 2"); return super.onCreateOptionsMenu(menu); } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { FragmentManager fm = getSupportFragmentManager(); switch (item.getItemId()) { case 0: Fragment2 frag2 = (Fragment2) fm.findFragmentById(R.id.frag2); frag2.setTexto("Novo Texto"); break; } return true; }

sábado, 17 de novembro de 12

Page 90: Aula android 05

sábado, 17 de novembro de 12

Page 91: Aula android 05

@CarlosCaval

[email protected]

CarlosCavalcanti.com

sábado, 17 de novembro de 12