Aula android 05

Post on 09-Jul-2015

620 views 1 download

Transcript of Aula android 05

sábado, 17 de novembro de 12

Desenvolvedor de softwarewww.carloscavalcanti.com

twitter @carloscaval

contato@carloscavalcanti.com

github.com/carloscavalcanti

slideshare.net/carloscavalcanti

sábado, 17 de novembro de 12

Integração com webservice

Testes unitários

JSON

Testes funcionais

Fragments

sábado, 17 de novembro de 12

JSON

sábado, 17 de novembro de 12

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

Vamos imaginar uma classe “Funcionario”

sábado, 17 de novembro de 12

Exemplo

public class Funcionario {

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

sábado, 17 de novembro de 12

sábado, 17 de novembro de 12

E agora gostaria de transforma-la em JSON.

Como?sábado, 17 de novembro de 12

Jackson

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

Como adicionar a biblioteca?

sábado, 17 de novembro de 12

sábado, 17 de novembro de 12

sábado, 17 de novembro de 12

sábado, 17 de novembro de 12

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

Json de um funcionário

sábado, 17 de novembro de 12

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

Como implementar?

sábado, 17 de novembro de 12

Vamos utilizar a classe ObjectMapper do

Jackson

sábado, 17 de novembro de 12

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

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

writeValueAsString.

sábado, 17 de novembro de 12

String writeValueAsString(Object value)

sábado, 17 de novembro de 12

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

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

output

sábado, 17 de novembro de 12

E uma lista de funcionários, como

ficaria?

sábado, 17 de novembro de 12

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

output

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

sábado, 17 de novembro de 12

Beleza?

sábado, 17 de novembro de 12

Vamos imaginar agora uma classe Pagamento

sábado, 17 de novembro de 12

Exemplo

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

sábado, 17 de novembro de 12

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

output - Pagamento

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

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

sábado, 17 de novembro de 12

Vamos criar uma lista de Pagamentos

sábado, 17 de novembro de 12

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

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

sábado, 17 de novembro de 12

Como podemos fazer o inverso?

sábado, 17 de novembro de 12

Ler um JSON e transformar em objeto.

sábado, 17 de novembro de 12

Para isso usamos o método readValue

sábado, 17 de novembro de 12

Object ReadValue(String, Class)

sábado, 17 de novembro de 12

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

Webservice

sábado, 17 de novembro de 12

Requesthttp://www.teste.com/pegarClientes

Capturando dados

sábado, 17 de novembro de 12

Response

sábado, 17 de novembro de 12

Request

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

sábado, 17 de novembro de 12

Response

sábado, 17 de novembro de 12

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

Testes automatizados

sábado, 17 de novembro de 12

Porque testar?

sábado, 17 de novembro de 12

sábado, 17 de novembro de 12

Alguns tipos de teste

• Teste unitário

• Teste funcional

• Teste de integração

• Teste de stress

sábado, 17 de novembro de 12

Alguém conhece?

sábado, 17 de novembro de 12

Usa?sábado, 17 de novembro de 12

Teste unitário

JUnit

sábado, 17 de novembro de 12

TDD (Test drive-development)

sábado, 17 de novembro de 12

Desenvolvimento orientado a testes

sábado, 17 de novembro de 12

Caminho a seguir

sábado, 17 de novembro de 12

Passos de bebê

sábado, 17 de novembro de 12

Vamos lá

sábado, 17 de novembro de 12

DOJO

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

sábado, 17 de novembro de 12

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

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

sábado, 17 de novembro de 12

Criando o projeto de teste

sábado, 17 de novembro de 12

Padrão: nomeProjeto+Test

sábado, 17 de novembro de 12

Selecionando projeto Target

sábado, 17 de novembro de 12

Teste funcional

Robotium

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

sábado, 17 de novembro de 12

Criando projeto para teste

sábado, 17 de novembro de 12

sábado, 17 de novembro de 12

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

Classe Solo

sábado, 17 de novembro de 12

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

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

Fragments

sábado, 17 de novembro de 12

Como desenvolver layouts que sejam facilmente portados para smartphones e

tablets?

sábado, 17 de novembro de 12

Fragmento

sábado, 17 de novembro de 12

sábado, 17 de novembro de 12

sábado, 17 de novembro de 12

Disponibilidade

Horneycomb

Ice Cream Sandwich

sábado, 17 de novembro de 12

Android inferiores ao 3.0...

sábado, 17 de novembro de 12

Adicionamos a lib

Android-support-4

sábado, 17 de novembro de 12

sábado, 17 de novembro de 12

Por onde começar?

sábado, 17 de novembro de 12

Criando alguns “fragmentos”

sábado, 17 de novembro de 12

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

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

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

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

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

main_fragments.xml

sábado, 17 de novembro de 12

@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

sábado, 17 de novembro de 12

@CarlosCaval

contato@carloscavalcanti.com

CarlosCavalcanti.com

sábado, 17 de novembro de 12