您的位置:首页 > 移动开发 > Android开发

android关于轮询的一种解决方案

2016-05-07 11:40 465 查看
         前段时间,由于公司项目中某个功能需要用到轮询的操作,所以参考了网上的一些资料,做了一个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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android