android关于轮询的一种解决方案
来源:互联网 发布:怎么查看端口号被占用 编辑:程序博客网 时间:2024/06/06 03:39
前段时间,由于公司项目中某个功能需要用到轮询的操作,所以参考了网上的一些资料,做了一个demo。主要方案是:AlarmManager + BroadcastReceiver + Service
首选需要获取AlarmManager,并包装要执行的服务:
/** * 开始轮询 */ public static void startPolling(Context context, int seconds, Class<?> cls, String action) { //获取AlarmManager系统服务 AlarmManager manager = (AlarmManager) context .getSystemService(Context.ALARM_SERVICE); //包装需要执行Service的Intent Intent intent = new Intent(context, cls); intent.setAction(action); PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); //触发服务的起始时间 long triggerAtTime = SystemClock.elapsedRealtime(); //使用AlarmManger的setRepeating方法设置定期执行的时间间隔(seconds秒)和需要执行的Service manager.setRepeating(AlarmManager.ELAPSED_REALTIME, triggerAtTime, seconds * 1000, pendingIntent); } /** * 停止轮询服务 */ public static void stopPolling(Context context, Class<?> cls, String action) { AlarmManager manager = (AlarmManager) context .getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, cls); intent.setAction(action); PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); //取消正在执行的服务 manager.cancel(pendingIntent); }然后我们需要在服务中执行获取数据的操作:
@Override public int onStartCommand(Intent intent, int flags, int startId) { thread = new Thread(new Runnable() { @Override public void run() { Intent intent = new Intent(); intent.setAction("CustomBroadcastReceiver"); intent.putExtra("data",++i); sendBroadcast(intent); } }); thread.start(); return super.onStartCommand(intent, flags, startId); }在广播中,我定义了一个回调。广播接收到数据后,会执行回调,把数据传给activity:
private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if(auctionListener == null) { Toast.makeText(context,"监听器为空",Toast.LENGTH_SHORT).show(); return; }else { auctionListener.onUpdataAction(msg.what); } } }; @Override public void onReceive(Context context, Intent intent) { this.context = context; Message message = handler.obtainMessage(); message.what = intent.getIntExtra("data",0); handler.sendMessage(message); }不过有一个问题,我明明在activity中设置了回调,仍然会执行监听器为空的操作,不明白为什么。知道的麻烦,回复一下,到底是什么原因?
然后是在activity中调用:
<span style="font-size:14px;"> @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.text); receiver = new CustomBroadcastReceiver(); receiver.setOnAuctionListener(this); IntentFilter intentFilter = new IntentFilter(CustomBroadcastReceiver.ACTION); registerReceiver(receiver,intentFilter); PollingUtils.startPolling(this,1,MyService.class,MyService.ACTION); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); PollingUtils.stopPolling(this,MyService.class,MyService.ACTION); } @Override public void onUpdataAction(int data) { textView.setText(data+""); }</span>
0 0
- android关于轮询的一种解决方案
- 轮询的一种解决方案(RxJava)
- 关于Online Judge System的编译延时的一种解决方案
- 关于IE7 IE8兼容HTML5和CSS3的一种解决方案
- 关于嵌入式ARM开发板联网的一种解决方案
- 关于XCode5打开工程闪退的一种解决方案
- 关于java.util.NoSuchElementException的其中一种解决方案
- 关于开源库ScrollableLayout对RecyclerView支持不完善的一种解决方案
- 关于RecyclerView条目内嵌列表的一种常用解决方案
- Android 关于OOM的解决方案
- Android 关于OOM的解决方案
- Android 关于OOM的解决方案
- Android 关于OOM的解决方案
- Android 关于OOM的解决方案
- Android 关于OOM的解决方案
- Android关于OOM的解决方案
- Android 关于OOM的解决方案
- Android关于OOM的解决方案
- 华为自主操作系统
- Android网络编程之Apache接口
- mysql单表多timestamp的current_timestamp设置问题
- 关于Java中Scanner对象的hasNext()方法对实现Readable接口的对象中的read()方法调用的探讨
- 系统调用与标准IO库区别
- android关于轮询的一种解决方案
- Error while performing database login with the mysql driver
- Cocos2d-x-3.10创建一个HelloWorld新项目
- Activity生命周期图
- Spark搭建HA详解
- REST初体验
- webview修改版式
- js--面向对象--非构造函数的继承
- Android PopupWindow弹出窗口的完美实现(实现弹出背景变暗效果)