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
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> } };