Problema com handler, Android…

Há algum tempo foi desenvolvido uma aplicação la na empresa feita em Android, eu fui um dos participantes do desenvolvimento.

É muito gratificante desenvolver em Android, ele possui uma gama de ferramentas que te ajudam e facilitam o desenvolvimento, existem vários tutoriais e muitos livros bons no mercado.

Um desses livros que recomendo que me ajudou muito no inicio foi “Google Android – Aprenda A Criar Aplicações Para Dispositivos Móveis”, é um livro para iniciantes com muitos exemplos . Porém, como tudo na vida não são flores, um problema do Android, são suas várias versões, é simplesmente um parto compatibilizar sua aplicação com essas versões. No incio me bati bastante no desenvolvimento da aplicação lá da empresa, pois os tablets que testamos eram com versões 4.1, e algumas funcionalidades deixavam de funcionar. Porém, uma que mais me intrigou foi um erro que era gerado quando a aplicação executava uma impressão de um documento em uma impressora bluetooth em uma versão do android 3.2.

O erro que dava era esse “Can’t create handler inside thread that has not called Looper.prepare()”.

Após perder várias horas pesquisando no pai dos burros(google hehehe), descobri uma solução simples e elegante em um blog de um cara Indiano. Ele passou pelo mesmo problema e a solução simplesmente era chamar o método Looper.loop(). Por algum motivo na versão 4.1 do Android não é preciso chamar essa função. Abaixo segue o código completo e a fonte de onde foi encontrado. Espero que ajude vocês que estão passando pelo mesmo problema.

Antes segue um vídeo que fiz demonstrando o uso da aplicação:
Video: http://www.youtube.com/watch?v=UpNWYRvcou4

Fonte: http://mukeshyadav4u.blogspot.com.br/2012/11/cant-create-handler-inside-thread-that_8.html#comment-form

private Handler handler = new Handler() {
 @Override
 public void handleMessage(Message msg) {

 final SyncRequestManager test = new SyncRequestManager(Test.this);
 try {
            message = message.replaceAll("\n", "");
            progressDialog= ProgressDialog.show(Test.this,
                   "", "Shairing please wait....",true);

        new Thread() {
                  public void run() {
                         try{
                             <strong>Looper.prepare();</strong>
                             JSONObject jsonObject = test.postOnFacebookWall(message,byteArray);

                                 JSONObject response = jsonObject.getJSONObject("response");
                                 final String iconUrl = response.getString("icon");
                                 Log.i(" Response" , ""+response);
                                 Log.i(" Icon" , ""+iconUrl);

                                      final FacebookUtil fbUtil = new FacebookUtil(ShareMotekon.this);
       fbUtil.postMessageOnWall(message, iconUrl,byteArray);
       sleep(8000);
      } catch (Exception e) {
          Log.d("Exception", e.getMessage());
      }
           progressDialog.dismiss();                       
           mhandler.sendEmptyMessage(0);
     }
   }.start();
 } catch (Exception e) {
 e.printStackTrace();

   }
  }
};

 private Handler mhandler = new Handler() {

  @Override
    public void handleMessage(Message msg) {
   btnNext.setEnabled(true);
   Toast.makeText(ShareMotekon.this,
                       "Message Shared Successfully!", Toast.LENGTH_LONG).show();

    Log.d("INSIDE HANDLER","FB SHARE");

    <strong>myLooper = Looper.myLooper();
            Looper.loop();
                         myLooper.quit();</strong>  
             }
    };