ATUALIZAÇÃO - 2016
A melhor alternativa é usar RxAndroid
(ligações específicas para RxJava
) para o P
no MVP
para assumir o comando fo dados.
Comece retornando Observable
do seu método existente.
private Observable<PojoObject> getObservableItems() {
return Observable.create(subscriber -> {
for (PojoObject pojoObject: pojoObjects) {
subscriber.onNext(pojoObject);
}
subscriber.onCompleted();
});
}
Use este Observável assim -
getObservableItems().
subscribeOn(Schedulers.io()).
observeOn(AndroidSchedulers.mainThread()).
subscribe(new Observer<PojoObject> () {
@Override
public void onCompleted() {
// Print Toast on completion
}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(PojoObject pojoObject) {
// Show Progress
}
});
}
-------------------------------------------------- -------------------------------------------------- ------------------------------
Eu sei que estou um pouco atrasado, mas aqui vai. O Android basicamente funciona em dois tipos de encadeamentos, ou seja, encadeamento da interface do usuário e encadeamento em segundo plano . De acordo com a documentação do Android -
Não acesse o kit de ferramentas da interface do usuário do Android de fora do thread da interface do usuário para corrigir esse problema, o Android oferece várias maneiras de acessar o thread da interface do usuário a partir de outros threads. Aqui está uma lista de métodos que podem ajudar:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Agora, existem vários métodos para resolver esse problema.
Vou explicar isso por exemplo de código:
runOnUiThread
new Thread()
{
public void run()
{
myactivity.this.runOnUiThread(new Runnable()
{
public void run()
{
//Do your UI operations like dialog opening or Toast here
}
});
}
}.start();
LOOPER
Classe usada para executar um loop de mensagem para um encadeamento. Os encadeamentos por padrão não têm um loop de mensagem associado a eles; para criar um, chame prepare () no thread que deve executar o loop e, em seguida, loop () para que ele processe as mensagens até que o loop seja interrompido.
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
AsyncTask
O AsyncTask permite que você execute um trabalho assíncrono na interface do usuário. Ele executa as operações de bloqueio em um encadeamento de trabalho e, em seguida, publica os resultados no encadeamento da interface do usuário, sem exigir que você lide com os encadeamentos e / ou manipuladores.
public void onClick(View v) {
new CustomTask().execute((Void[])null);
}
private class CustomTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... param) {
//Do some work
return null;
}
protected void onPostExecute(Void param) {
//Print Toast or open dialog
}
}
Handler
Um manipulador permite enviar e processar objetos Message e Runnable associados ao MessageQueue de um thread.
Message msg = new Message();
new Thread()
{
public void run()
{
msg.arg1=1;
handler.sendMessage(msg);
}
}.start();
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if(msg.arg1==1)
{
//Print Toast or open dialog
}
return false;
}
});
compile 'com.shamanland:xdroid-toaster:0.0.5'
, não requerrunOnUiThread()
ouContext
variável, toda a rotina se foi! apenas invocarToaster.toast(R.string.my_msg);
aqui está o exemplo: github.com/shamanland/xdroid-toaster-example