O Retrofit faz chamadas de rede no thread principal?
Pergunta
Estou tentando explorar o Retrofit + OkHttp no Android.Aqui está um código que encontrei online:
RestAdapter restAdapter = new RestAdapter.Builder().setExecutors(executor, executor)
.setClient(new OkClient(okHttpClient))
.setServer("blah").toString())
.build();
Se eu não usar o serviço executor, meu código estará sendo executado no thread principal?Devo fazer solicitações da web em um novo tópico?
Solução
O método que retorna um valor faz isso de forma síncrona.
@GET("/user/{id}/asset")
Asset getUserAsset(@Path("id") int id);
Para fazer isso de forma assíncrona, tudo que você precisa é adicionar um retorno de chamada.
@GET("/user/{id}/asset")
void getUserAsset(@Path("id") int id, Callback<Asset> cb);
Espero que isto ajude.
Cumprimentos!
Outras dicas
Os métodos de retrofit podem ser declarados para execução síncrona ou assíncrona.
Um método com tipo de retorno será executado de forma síncrona.
@GET("/user/{id}/photo")
Photo getUserPhoto(@Path("id") int id);
A execução assíncrona requer que o último parâmetro do método seja um Callback
.
@GET("/user/{id}/photo")
void getUserPhoto(@Path("id") int id, Callback<Photo> cb);
No Android, os retornos de chamada serão executados no thread principal.Para aplicativos de desktop, os retornos de chamada acontecerão no mesmo thread que executou a solicitação HTTP.
Retrofit também integra RxJava para suportar métodos com um tipo de retorno de rx.Observable
@GET("/user/{id}/photo")
Observable<Photo> getUserPhoto(@Path("id") int id);
As solicitações observáveis são assinadas de forma assíncrona e observadas no mesmo thread que executou a solicitação HTTP.Para observar em um tópico diferente (por ex.Thread principal do Android) chamada observeOn(Scheduler)
no devolvido Observable
.
Observação:A integração RxJava é experimental.