Download - Aula android 05
sábado, 17 de novembro de 12
Desenvolvedor de softwarewww.carloscavalcanti.com
twitter @carloscaval
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
CarlosCavalcanti.com
sábado, 17 de novembro de 12