发布网友 发布时间:2022-04-24 11:32
共1个回答
热心网友 时间:2023-10-11 07:10
表象Service中可以正常显示Toast,IntentService中不能正常显示Toast,在2.3系统上,不显示toast,在4.3系统上,toast显示,但是不会消失。2.原因Toast要求运行在UI主线程中。Service运行在主线程中,因此Toast是正常的。IntentService运行在的线程中,因此Toast不正常。3.在IntentService中显示Toast利用Handler,将显示Toast的工作,放在主线程中来做。具体有两个实现方式。Handler的post方式实现,这个方式比较简单。privatevoidshowToastByRunnable(finalIntentServicecontext,finalCharSequencetext,finalintration){Handlerhandler=newHandler(Looper.getMainLooper());handler.post(newRunnable(){@Overridepublicvoidrun(){Toast.makeText(context,text,ration).show();}});}Handler的msg方式实现,这个方式比较复杂。HandlermsgHandler=newHandler(Looper.getMainLooper()){@OverridepublicvoidhandleMessage(Messagemsg){Toast.makeText(ToastIntentService.this,msg.getData().getString("Text"),Toast.LENGTH_SHORT).show();super.handleMessage(msg);}};privatevoidshowToastByMsg(finalIntentServicecontext,finalCharSequencetext,finalintration){Bundledata=newBundle();data.putString("Text",text.toString());Messagemsg=newMessage();msg.setData(data);msgHandler.sendMessage(msg);}4.关于耗时操作Service中如果有耗时的操作,要开启一个Thread来做。IntentService是在的线程中,所以可以进行一些耗时操作。5.考虑AsyncTask与Service的使用区别如果是全后台的工作,使用Service,结果的提示可以使用Notification。如果是异步工作,工作结束后需要更新UI,那么最好使用Thread或者AsyncTask。