Criei um protótipo/aplicativo aonde o mesmo troca dados na web via Webservice (Restful JSON). Até aí tudo bem, o mesmo funciona certinho, só que agora estou “refinando” algumas coisas e para isso estou com certas dúvidas e gostaria de contar com a orientação dos colegas para esclarece-las.
Dúvidas:
No caso da autenticação no meu Webservice. Como faço para informa na aplicação móvel que o “logon” dele falhou? Sei que tenho que retornar algo informando tal falha na autenticação, mas como deve ser a coisa mais ou menos, já que isso é feito dentro de uma thread?
Como devo proceder para que em caso de alguma falha durante o processo de troca de dados com o Webservice, eu possa lançar algum de tipo de aviso (toas, alert, broadcast e etc) para o usuário, informando que o processo não obteve sucesso? Lembrando que o mesmo está sendo executado em uma thread ( public class SincActivity extends Activity implements Runnable ).
Bem, acho que é só isso para o momento. Exemplos, dicas e/ou tutorias me ajudariam muito.
1 - Se a requisição de logon retornar com codigo http 200 significa que ela foi realizada com sucesso,logo vc deve verificar o resultado retornado pelo seu webservice ,se o conteudo do da resposta do seu webservice for algo como “autenticado com sucesso”, significa que sua sessão de usuario no webservice foi inicializada e vc pode acessar as operações normalmente.
2 - No caso do erro da thread eu recomendo o uso de uma caixa de dialogo informando o motivo do erro,evite o uso de toast para informar erros pois as vezes o usuario acaba se distraindo olhando para alguma outra coisa externa e não percebe que ocorreu alguma mensagem de erro na tela.
[quote=Ramon Pires]1 - Se a requisição de logon retornar com codigo http 200 significa que ela foi realizada com sucesso,logo vc deve verificar o resultado retornado pelo seu webservice ,se o conteudo do da resposta do seu webservice for algo como “autenticado com sucesso”, significa que sua sessão de usuario no webservice foi inicializada e vc pode acessar as operações normalmente.
2 - No caso do erro da thread eu recomendo o uso de uma caixa de dialogo informando o motivo do erro,evite o uso de toast para informar erros pois as vezes o usuario acaba se distraindo olhando para alguma outra coisa externa e não percebe que ocorreu alguma mensagem de erro na tela. [/quote]
Mas tem como eu recuperar o “codigo 200” para puder tratar e seguir em frente? Agora se não houver exito, qual o “codigo http” retornado?
Eu não pensei em toast não. Pensei em um “alert” mesmo, pois como você mesmo falou fica melhor para informar ao usuário que algo de errado ocorreu. Agora como faço isso, já que não posso ter “elementos visuais” dentro da mais thread?
1 - pode ser um 404 ,que significa que o recurso que vc está querendo acessar não foi encontrado, pode ser o 500 ,que significa que o serviço está indisponível no momento, entre outros . Recomendo que estude um pouco sobre o http se vc quer utilizar a arquitetura REST nos seus sistemas, olhe aqui http://developer.android.com/training/basics/network-ops/connecting.html,o exemplo que eles disponibilizam:
private String downloadUrl(String myurl) throws IOException {
InputStream is = null;
// Only display the first 500 characters of the retrieved
// web page content.
int len = 500;
try {
URL url = new URL(myurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Starts the query
conn.connect();
int response = conn.getResponseCode();
Log.d(DEBUG_TAG, "The response is: " + response);
is = conn.getInputStream();
// Convert the InputStream into a string
String contentAsString = readIt(is, len);
return contentAsString;
// Makes sure that the InputStream is closed after the app is
// finished using it.
} finally {
if (is != null) {
is.close();
}
}
}
O int response = conn.getResponseCode(); recebe o codigo da resposta da requisição que foi realizada , logo vc pode tratar da forma que vc desejar cada codigo dentro da sua aplicação.
2 - Não entendi qual seria o problema em chamar um alert dialog , mas eu recomendo que ao invés de usar uma Thread vc poderia usar uma AsyncTask.
[quote=Ramon Pires]1 - pode ser um 404 ,que significa que o recurso que vc está querendo acessar não foi encontrado, pode ser o 500 ,que significa que o serviço está indisponível no momento, entre outros . Recomendo que estude um pouco sobre o http se vc quer utilizar a arquitetura REST nos seus sistemas, olhe aqui http://developer.android.com/training/basics/network-ops/connecting.html,o exemplo que eles disponibilizam:
private String downloadUrl(String myurl) throws IOException {
InputStream is = null;
// Only display the first 500 characters of the retrieved
// web page content.
int len = 500;
try {
URL url = new URL(myurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Starts the query
conn.connect();
int response = conn.getResponseCode();
Log.d(DEBUG_TAG, "The response is: " + response);
is = conn.getInputStream();
// Convert the InputStream into a string
String contentAsString = readIt(is, len);
return contentAsString;
// Makes sure that the InputStream is closed after the app is
// finished using it.
} finally {
if (is != null) {
is.close();
}
}
}
O int response = conn.getResponseCode(); recebe o codigo da resposta da requisição que foi realizada , logo vc pode tratar da forma que vc desejar cada codigo dentro da sua aplicação.
2 - Não entendi qual seria o problema em chamar um alert dialog , mas eu recomendo que ao invés de usar uma Thread vc poderia usar uma AsyncTask.
[/quote]
Endendido. Estudando…
Eu tentei utilizar toast, alert dialog alguma vezes no meu thread, mas não obtive sucesso, só isso! Qual a maior vantagem em mudar a Thread para AsyncTask? Pergunto pelo fato da minha rotina já esta feito em cima de Thread.
A vantagem é que ela simplifica a criação de tarefas assincronas, quem em algumas situações pode ser mais dificil de se manipular usando apenas threads, a além do mais você consegue tem um maior controle do que está sendo executado no momento.