Conectando o Android
a outros sistemas.
Elias Granja
Desenvolvedor @ciandt
@elias_era / http://www.eliasgranja.com.br
Sobre o que é a palestra?
●
UI Thread.
●
AsyncTask.
●
Trabalhando com Json.
●
Conexão com a web.
●
Cache!
Ui Thread?
Vulgo Main Thread!
Responsável por
componentes e suas
ações(callbacks).
Pode ficar bloqueada por
apenas alguns segundos.
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
//SOMETHING BIG HERE
Toast.makeText(context, “feito”,duration)
.show();
}
});
thread.start();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
//SOMETHING BIG HERE
Toast.makeText(context, “feito”,duration)
.show();
}
});
thread.start();
MyActivity.this.runOnUiThread(
new Runnable() {
public void run(){
Toast.makeText(context,
“feito”,duration).show();
}
});
}
});
thread.start();
AsyncTask
UI Thread Worker Thread
OnPreExecute
doInBackground
OnPreExecute
onProgressUpdate
OnPostExecute
Como usar?Extende AsyncTask! ;D
new MyAsyncTask().execute(params);
Pera, o que?
extends AsyncTask<Params, Progress, Result>
protected Result doInBackground(Params... params)
protected void onProgressUpdated(Progress... progress)
protected void onPostExecute(Result result)
protect final publishProgress(Progress.. progress)
protected void onPreExecute()
As regras
●
A instância da task precisa ser criada na UI Thread.
● O método execute precisa ser chamado na UI Thread.
●
Não chame na mão os métodos “especiais”.
●
Uma task só pode ser executada uma vez, uma
execção será lançada se tentar executar uma
segunda vez.
Paralelização entre as tasks?
●
Desde a versão 3 do android as tasks são executadas
numa única thread.
Se quiser execuções verdadeiramente paralelas, chame:
MyAsyncTask.
executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, Params params.
Web?
<uses-permission
android:name="android.permission.INTERNET" />
DefaultHttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(“http://flisol.net”);
post.setEntity(new StringEntity(“{name:'elias'}”));
HttpResponse rs = client.execute(post);
String json = EntityUtils.toString(rs.getEntity());
Trabalhando com JSON
JSONStringer
{
name: “Elias”,
state: “SP”,
}
JSONStringer js = new JSONString();
js.object();
js.key(“name”).value(“Elias”);
js.key(“state”).value(“SP”);
js.endObject();
JSONObject
object.getString(“name”);
object.getString(“state”);
//object.getLong
//object.getJSONArray
//object.getJSONObject
.....
JSONObject object = new JSONObject(json);
GSON
String json = Gson.toJson(elias);
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
GSON
Person elias =
Gson.fromJson(json, Person.class)
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
Cache!
Static?
Class FacebookPhotosTask<URL, Integer, Image>{
Static Map<String,Image> myPhoto;
//....
Application?
< Application
Android:name=”br.com.eliasgranja.app.ExampleApp”>
No manifesto
Public class ExampleApp extends Application{
Private Map<String,Image> cache;
Public void cache(Image image, String name){
Cache.put(name,image);
}
Criando a class
ExampleApp app =
(ExampleApp) myActivity.getApplication();
Utilizando na Activity
Quem é melhor?
Então....
Perguntas?
@elias_era / http://www.eliasgranja.com.br
Elias Granja

Conectando o Android a outros sistemas

Notas do Editor

  • #12 Android irá matar o aplicativo se não respeitarmos o limite de tempo da UI Thread. Autalmente 5 segundos
  • #14 Dessa forma criamos outra thread e temos tempo “infinito” para fazermos o que acharmos melhor.
  • #15 O código parecia ser bonito, mas não podemos alterar a tela do usuário por uma thread que não seja a UI thread. Então temos que fazer algumas “gambiarras” para conseguirmos isso. http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29
  • #16 http://developer.android.com/reference/android/app/Activity.html#runOnUiThread%28java.lang.Runnable%29
  • #22 A classe AsyncTask tem 3 métodos abstrados que devemos definir comportamento. Dbackground que fará o trabalho. ProgressUpdated para mostrar algum tipo de progresso na tela do usuário. E por fim postExecute que já tem o resultado final. PostExecute é chamado automaticamente, enquanto que o ProgressUpdated precisa ser chamado manualmente via publishProgress. “ Forma de reutilizar o mesmo código com diferentes inputs” – Oracle docs
  • #38 Base class for those who need to maintain global application state. You can provide your own implementation by specifying its name in your AndroidManifest.xml&apos;s &lt;application&gt; tag, which will cause that class to be instantiated for you when the process for your application/package is created.