RxJava和Android服务

时间:2017-02-08 01:42:11

标签: android service rx-java

我做了一个简单的功能测试,但是遇到了一个奇怪的问题。

功能测试是:在活动中启动服务,然后在服务中使用RxJava和boradcast向活动发送消息,最后在活动中接收消息。

开始服务:

Intent i = new Intent(this, StartIntentService.class);
startService(i);

发送消息:

@Override
protected void onHandleIntent(Intent intent) {

    Observable.interval(0, 500, TimeUnit.MILLISECONDS)
            .filter(integer -> {
                return (integer < 400) && (integer % 3 == 0);
            })
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(integer -> {
                mIntent.putExtra("num", integer);
                sendBroadcast(mIntent);
            });
}

收到消息:

class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (ACTIVITY_SERVICE_INTERACTIVE.equals(intent.getAction())) {
            int res = intent.getIntExtra("num", -1);
            mResTv.append(res + "" + "\t\t\t\t");
        }
    }
}

预期结果是:所有数字都可以被3整除,但实际结果是:所有数字都是-1。

如果我用范围替换方法间隔,或者我添加一个方法:.observeOn(AndroidSchedulers.mainThread()),一切顺利。

为什么?

1 个答案:

答案 0 :(得分:2)

Observable.interval会发出Long个值,而在onReceive中,您会使用getIntExtra(而不是getLongExtra)提取值。因此getIntExtra会返回您指定为默认值(-1)的值。

Observable.range会发出Integer个值,因此一切都按预期进行。