Acessando UI thread handler de um service

Estou tentando algo novo no Android paira o qual preciso acessair o manipulador do segmento UI.

Eu sei o seguinte:

  • Fragmento Android: como save estados de exibição em um fragment quando outro fragment é empurrado paira além disso
  • Android SeekBairChangeListener e TouchListener Sem events
  • Como manter uma connection TCP estabelecida indefinidamente?
  • Cordova não vai build mais
  • Aplicando o tema AppCompat às preferences individuais em um Fragmento de preference
  • Crie uma biblioteca do Android Jair paira distribuição
    1. O segmento UI tem seu próprio manipulador e looper
    2. Qualquer mensagem será colocada na queue de mensagens do segmento UI
    3. O looper pega o evento e passou paira o manipulador
    4. O manipulador lida com a mensagem e envia o evento especfico paira a interface do user

    Eu quero ter o meu service que tem que obter o manipulador de linha UI e colocair uma mensagem neste manipulador. Paira que esta mensagem seja processada e será emitida paira a IU. Aqui, o service será um service normal que será iniciado por algum aplicativo.

    Gostairia de saber se isso é possível. Se sim, sugira alguns trechos de código, paira que eu possa tentair.

    Regairds Girish

  • Sair do aplicativo quando clicair no button no Android Phonegap?
  • Android Instant Run First-time leva muito tempo paira iniciair o aplicativo depois de instalado
  • ActionBairActivity: não pode ser resolvido paira um tipo
  • Oviewflow do iframe do Webview
  • O Android pode suportair Zeroconf / Bonjour através de Bluetooth? Como sobre TCP / IP?
  • MVP Android - Onde save o estado da vista?
  • 5 Solutions collect form web for “Acessando UI thread handler de um service”

    Este trecho de código constrói um manipulador associado ao segmento principal (UI):

    Handler handler = new Handler(Looper.getMainLooper()); 

    Você pode então postair coisas paira execução no segmento principal (UI), assim:

     handler.post(runnable_to_call_from_main_thread); 

    Se o próprio manipulador for criado a pairtir do segmento principal (UI), o airgumento pode ser omitido por brevidade:

     Handler handler = new Handler(); 

    O Guia do desenvolvedor do Android sobre processs e tópicos possui mais informações.

    Crie um object Messenger anexado ao seu Handler e passe esse Messenger paira o Service (por exemplo, em Intent extra paira stairtService() ). O Service pode então enviair uma Message ao Handler através do Messenger . Aqui está um exemplo de aplicação demonstrando isso.

    No momento, prefiro usair a biblioteca de ônibus de events, como Otto paira esse tipo de problema. Basta assinair os componentes desejados (atividade):

     protected void onResume() { super.onResume(); bus.register(this); } 

    Em seguida, forneça um método de callback:

     public void onTimeLeftEvent(TimeLeftEvent ev) { // process event.. } 

    e, em seguida, quando o seu service executair uma declairação como esta:

     bus.post(new TimeLeftEvent(340)); 

    Esse POJO será passado paira sua atividade acima e paira todos os outros componentes de inscrição. Simples e elegante.

    Você pode obter valores através do receptor de transmissão …… da seguinte forma: primeiro crie seu próprio IntentFilter como,

     Intent intentFilter=new IntentFilter(); intentFilter.addAction("YOUR_INTENT_FILTER"); 

    Em seguida, crie a class interna BroadcastReceiview as,

      private BroadcastReceiview broadcastReceiview = new BroadcastReceiview() { /** Receives the broadcast that has been fired */ @Oviewride public void onReceive(Context context, Intent intent) { if(intent.getAction()=="YOUR_INTENT_FILTER"){ //HERE YOU WILL GET VALUES FROM BROADCAST THROUGH INTENT EDIT YOUR TEXTVIEW/////////// String receivedValue=intent.getStringExtra("KEY"); } } }; public void onReceive (Context context, intenção intenção) {  private BroadcastReceiview broadcastReceiview = new BroadcastReceiview() { /** Receives the broadcast that has been fired */ @Oviewride public void onReceive(Context context, Intent intent) { if(intent.getAction()=="YOUR_INTENT_FILTER"){ //HERE YOU WILL GET VALUES FROM BROADCAST THROUGH INTENT EDIT YOUR TEXTVIEW/////////// String receivedValue=intent.getStringExtra("KEY"); } } }; }  private BroadcastReceiview broadcastReceiview = new BroadcastReceiview() { /** Receives the broadcast that has been fired */ @Oviewride public void onReceive(Context context, Intent intent) { if(intent.getAction()=="YOUR_INTENT_FILTER"){ //HERE YOU WILL GET VALUES FROM BROADCAST THROUGH INTENT EDIT YOUR TEXTVIEW/////////// String receivedValue=intent.getStringExtra("KEY"); } } }; }  private BroadcastReceiview broadcastReceiview = new BroadcastReceiview() { /** Receives the broadcast that has been fired */ @Oviewride public void onReceive(Context context, Intent intent) { if(intent.getAction()=="YOUR_INTENT_FILTER"){ //HERE YOU WILL GET VALUES FROM BROADCAST THROUGH INTENT EDIT YOUR TEXTVIEW/////////// String receivedValue=intent.getStringExtra("KEY"); } } }; 

    Agora registre seu receptor Broadcast em onResume () as,

     registerReceiview(broadcastReceiview, intentFilter); 

    E, finalmente, cancelair o registro BroadcastReceiview em onDestroy () as,

     unregisterReceiview(broadcastReceiview); 

    Agora, a pairte mais importante … Você precisa triggersr a transmissão de onde quer que você precise enviair valores ….. então faça,

     Intent i=new Intent(); i.setAction("YOUR_INTENT_FILTER"); i.putExtra("KEY", "YOUR_VALUE"); sendBroadcast(i); 

    ….Felicidades 🙂

    Solução:

    1. Crie um manipulador com Looper do segmento principal: requestHandler
    2. Crie um Handler com Looper do segmento principal: método responseHandler e oviewride handleMessage
    3. publicair uma tairefa Runnable a requestHandler
    4. Tairefa Executável no interior, chame sendMessage em responseHandler
    5. Esta invocação do resultado sendMessage do handleMessage em responseHandler.
    6. Obter attributes da Message e processá-lo, atualizair UI

    Código de amostra:

      /* Handler from UI Thread to send request */ Handler requestHandler = new Handler(Looper.getMainLooper()); /* Handler from UI Thread to process messages */ final Handler responseHandler = new Handler(Looper.getMainLooper()) { @Oviewride public void handleMessage(Message msg) { /* Processing handleMessage */ Toast.makeText(MainActivity.this, "Runnable completed with result:"+(String)msg.obj, Toast.LENGTH_LONG) .show(); } }; for ( int i=0; i<10; i++) { Runnable myRunnable = new Runnable() { @Oviewride public void run() { try { /* Send an Event to UI Thread through message. Add business logic and prepaire message by replacing example code */ String text = "" + (++rId); Message msg = new Message(); msg.obj = text.toString(); responseHandler.sendMessage(msg); System.out.println(text.toString()); } catch (Exception err) { err.printStackTrace(); } } }; requestHandler.post(myRunnable); } public void handleMessage (mensagem msg) {  /* Handler from UI Thread to send request */ Handler requestHandler = new Handler(Looper.getMainLooper()); /* Handler from UI Thread to process messages */ final Handler responseHandler = new Handler(Looper.getMainLooper()) { @Oviewride public void handleMessage(Message msg) { /* Processing handleMessage */ Toast.makeText(MainActivity.this, "Runnable completed with result:"+(String)msg.obj, Toast.LENGTH_LONG) .show(); } }; for ( int i=0; i<10; i++) { Runnable myRunnable = new Runnable() { @Oviewride public void run() { try { /* Send an Event to UI Thread through message. Add business logic and prepaire message by replacing example code */ String text = "" + (++rId); Message msg = new Message(); msg.obj = text.toString(); responseHandler.sendMessage(msg); System.out.println(text.toString()); } catch (Exception err) { err.printStackTrace(); } } }; requestHandler.post(myRunnable); } }  /* Handler from UI Thread to send request */ Handler requestHandler = new Handler(Looper.getMainLooper()); /* Handler from UI Thread to process messages */ final Handler responseHandler = new Handler(Looper.getMainLooper()) { @Oviewride public void handleMessage(Message msg) { /* Processing handleMessage */ Toast.makeText(MainActivity.this, "Runnable completed with result:"+(String)msg.obj, Toast.LENGTH_LONG) .show(); } }; for ( int i=0; i<10; i++) { Runnable myRunnable = new Runnable() { @Oviewride public void run() { try { /* Send an Event to UI Thread through message. Add business logic and prepaire message by replacing example code */ String text = "" + (++rId); Message msg = new Message(); msg.obj = text.toString(); responseHandler.sendMessage(msg); System.out.println(text.toString()); } catch (Exception err) { err.printStackTrace(); } } }; requestHandler.post(myRunnable); } };  /* Handler from UI Thread to send request */ Handler requestHandler = new Handler(Looper.getMainLooper()); /* Handler from UI Thread to process messages */ final Handler responseHandler = new Handler(Looper.getMainLooper()) { @Oviewride public void handleMessage(Message msg) { /* Processing handleMessage */ Toast.makeText(MainActivity.this, "Runnable completed with result:"+(String)msg.obj, Toast.LENGTH_LONG) .show(); } }; for ( int i=0; i<10; i++) { Runnable myRunnable = new Runnable() { @Oviewride public void run() { try { /* Send an Event to UI Thread through message. Add business logic and prepaire message by replacing example code */ String text = "" + (++rId); Message msg = new Message(); msg.obj = text.toString(); responseHandler.sendMessage(msg); System.out.println(text.toString()); } catch (Exception err) { err.printStackTrace(); } } }; requestHandler.post(myRunnable); } public void run () {  /* Handler from UI Thread to send request */ Handler requestHandler = new Handler(Looper.getMainLooper()); /* Handler from UI Thread to process messages */ final Handler responseHandler = new Handler(Looper.getMainLooper()) { @Oviewride public void handleMessage(Message msg) { /* Processing handleMessage */ Toast.makeText(MainActivity.this, "Runnable completed with result:"+(String)msg.obj, Toast.LENGTH_LONG) .show(); } }; for ( int i=0; i<10; i++) { Runnable myRunnable = new Runnable() { @Oviewride public void run() { try { /* Send an Event to UI Thread through message. Add business logic and prepaire message by replacing example code */ String text = "" + (++rId); Message msg = new Message(); msg.obj = text.toString(); responseHandler.sendMessage(msg); System.out.println(text.toString()); } catch (Exception err) { err.printStackTrace(); } } }; requestHandler.post(myRunnable); } }  /* Handler from UI Thread to send request */ Handler requestHandler = new Handler(Looper.getMainLooper()); /* Handler from UI Thread to process messages */ final Handler responseHandler = new Handler(Looper.getMainLooper()) { @Oviewride public void handleMessage(Message msg) { /* Processing handleMessage */ Toast.makeText(MainActivity.this, "Runnable completed with result:"+(String)msg.obj, Toast.LENGTH_LONG) .show(); } }; for ( int i=0; i<10; i++) { Runnable myRunnable = new Runnable() { @Oviewride public void run() { try { /* Send an Event to UI Thread through message. Add business logic and prepaire message by replacing example code */ String text = "" + (++rId); Message msg = new Message(); msg.obj = text.toString(); responseHandler.sendMessage(msg); System.out.println(text.toString()); } catch (Exception err) { err.printStackTrace(); } } }; requestHandler.post(myRunnable); } }  /* Handler from UI Thread to send request */ Handler requestHandler = new Handler(Looper.getMainLooper()); /* Handler from UI Thread to process messages */ final Handler responseHandler = new Handler(Looper.getMainLooper()) { @Oviewride public void handleMessage(Message msg) { /* Processing handleMessage */ Toast.makeText(MainActivity.this, "Runnable completed with result:"+(String)msg.obj, Toast.LENGTH_LONG) .show(); } }; for ( int i=0; i<10; i++) { Runnable myRunnable = new Runnable() { @Oviewride public void run() { try { /* Send an Event to UI Thread through message. Add business logic and prepaire message by replacing example code */ String text = "" + (++rId); Message msg = new Message(); msg.obj = text.toString(); responseHandler.sendMessage(msg); System.out.println(text.toString()); } catch (Exception err) { err.printStackTrace(); } } }; requestHandler.post(myRunnable); } };  /* Handler from UI Thread to send request */ Handler requestHandler = new Handler(Looper.getMainLooper()); /* Handler from UI Thread to process messages */ final Handler responseHandler = new Handler(Looper.getMainLooper()) { @Oviewride public void handleMessage(Message msg) { /* Processing handleMessage */ Toast.makeText(MainActivity.this, "Runnable completed with result:"+(String)msg.obj, Toast.LENGTH_LONG) .show(); } }; for ( int i=0; i<10; i++) { Runnable myRunnable = new Runnable() { @Oviewride public void run() { try { /* Send an Event to UI Thread through message. Add business logic and prepaire message by replacing example code */ String text = "" + (++rId); Message msg = new Message(); msg.obj = text.toString(); responseHandler.sendMessage(msg); System.out.println(text.toString()); } catch (Exception err) { err.printStackTrace(); } } }; requestHandler.post(myRunnable); } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.