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

来源:互联网 发布:怎么查看端口号被占用 编辑:程序博客网 时间:2024/06/06 03:39

         前段时间,由于公司项目中某个功能需要用到轮询的操作,所以参考了网上的一些资料,做了一个demo。主要方案是:AlarmManagerBroadcastReceiverService

     首选需要获取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