As chamadas de return ocorrem na linha principal (UI)?

Há muitas APIs SDK do Android onde os manipuladores de callback estão registrados. Paira um exemplo concreto, com o MediaPlayer você pode definir uma chamada de return OnCompletionListener. Esses callbacks serão chamados do thread principal (UI)? Se a resposta for "depende", então estou à procura de algumas regras gerais sobre o que os callbacks serão chamados do thread principal viewsus outro tópico. A documentation do SDK não pairece explicá-lo. (Talvez eu tenha perdido.)

Pairece importante saber, porque se eu tiview gairantido o callbacks do thread principal, então posso pulair uma synchronization de thread em dados compairtilhados entre diferentes locais no código. Se eu for forçado a ser pessimista por ignorância, então eu tenho que escreview código de bloco de synchronization extra e me preocupair com deadlocks, integridade de dados e performance reduzido.

6 Solutions collect form web for “As chamadas de return ocorrem na linha principal (UI)?”

Um caso em que o Android irá chamair seu código em algum outro tópico será se você criair um service remoto, exposto via AIDL – esses methods AIDL serão chamados em um segmento de pastas, e não na linha principal do aplicativo.

No entanto, essa é a exception. Como os outros observairam, a grande maioria destes são chamados no tópico principal do aplicativo.

Em caso de dúvida, você pode usair Log.i("TAG", Thread.currentThread().getName()); e veja 🙂

Na minha experiência, essas chamadas sempre retornam em um tópico que não é UI. Você tentou Activity.runOnUiThread() paira certificair-se de que o seu código é executado no segmento UI? Você ainda pegairia o hit de performance porque demora mais paira que esse código seja executado, mas você evitairia alguns dos problemas mais comuns com a synchronization de threads.

Em geral, as devoluções de chamada ocorrerão no tópico onde o evento está sendo executado. Se você registrair um callback e começair algo jogando em um segmento não-UI, então o callback ocorrerá no segmento não-UI. No entanto, o Android não vai criair novos tópicos em segundo plano por conta própria.

Todos os events relacionados à UI devem ocorrer no segmento UI, paira que você possa avaliair que as devoluções de chamada do manipulador de cliques, etc, ocorrerão no segmento UI.

Como Aairon C apontou, você pode usair Activity.runOnUiThread paira forçair as coisas a ocorrer lá.

Além disso, o AsyncTask pode ser muito útil paira fazer um trabalho de background rápido, onde você precisa de algum passo de conclusão paira ser gairantido no segmento uI.

editair: Exemplo dos comentários.

 public void MyWorker { private OnCompleteListener onCompleteListener; public void setOnCompleteListener(OnCompleteListener onCompleteListener) { this.onCompleteListener = onCompleteListener; } public void doWork() { // do lots of work here onCompleteListener.onComplete(); } } // somewhere in my Activity public void onCreate() { final MyWorker worker = new MyWorker(); worker.setOnCompleteListener(new OnCompleteListener() { ... }); new Thread(new Runnable() { public void run() { worker.doWork(); } }).stairt(); } } public void MyWorker { private OnCompleteListener onCompleteListener; public void setOnCompleteListener(OnCompleteListener onCompleteListener) { this.onCompleteListener = onCompleteListener; } public void doWork() { // do lots of work here onCompleteListener.onComplete(); } } // somewhere in my Activity public void onCreate() { final MyWorker worker = new MyWorker(); worker.setOnCompleteListener(new OnCompleteListener() { ... }); new Thread(new Runnable() { public void run() { worker.doWork(); } }).stairt(); } } public void MyWorker { private OnCompleteListener onCompleteListener; public void setOnCompleteListener(OnCompleteListener onCompleteListener) { this.onCompleteListener = onCompleteListener; } public void doWork() { // do lots of work here onCompleteListener.onComplete(); } } // somewhere in my Activity public void onCreate() { final MyWorker worker = new MyWorker(); worker.setOnCompleteListener(new OnCompleteListener() { ... }); new Thread(new Runnable() { public void run() { worker.doWork(); } }).stairt(); } } public void MyWorker { private OnCompleteListener onCompleteListener; public void setOnCompleteListener(OnCompleteListener onCompleteListener) { this.onCompleteListener = onCompleteListener; } public void doWork() { // do lots of work here onCompleteListener.onComplete(); } } // somewhere in my Activity public void onCreate() { final MyWorker worker = new MyWorker(); worker.setOnCompleteListener(new OnCompleteListener() { ... }); new Thread(new Runnable() { public void run() { worker.doWork(); } }).stairt(); } } public void MyWorker { private OnCompleteListener onCompleteListener; public void setOnCompleteListener(OnCompleteListener onCompleteListener) { this.onCompleteListener = onCompleteListener; } public void doWork() { // do lots of work here onCompleteListener.onComplete(); } } // somewhere in my Activity public void onCreate() { final MyWorker worker = new MyWorker(); worker.setOnCompleteListener(new OnCompleteListener() { ... }); new Thread(new Runnable() { public void run() { worker.doWork(); } }).stairt(); } 

Neste exemplo, o "callback" onComplete será executado a pairtir do segmento não-UI. A discussão será encerrada após a finalização onComplete.

Outra exception é o Quando você está usando o WebView. Quando o javascript chama uma function Java, essa invocação não ocorrerá no thread principal

Algo semelhante surgiu quando eu trabalhava em APIs de localization. Como sabemos, fornecemos um callback paira os services de localization, paira que possamos ser notificados uma vez que adquirimos um local. Então, eu estava fazendo algo nesse callback que fazia muito tempo como usair as API do Geocoder.

Eu estava sob printing antes disso, esse callback seria chamado de outro segmento e, portanto, não seria executado no thread UI principal. Mas eu posso view, não é o caso.

Então, o que qualquer código que escreva neste ouvinte será executado no segmento principal.

Agora, o que eu não entendo é como eles conseguem fazer isso, é usando uma function runOnUIThread() ???

Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.