基于注释处理生成代码的RxBus[Deprecated!]

本文介绍了一个基于RxJava2和RxAndroid的事件总线AndroidRxBus,它通过注释处理自动生成模板代码,提供了避免反射性能损耗的解决方案。文章详细展示了如何在Android项目中引入依赖、注册和注销事件监听器,以及如何使用@Subscribe和@RxThread注释标记事件处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Deprecated!

思考再三,该项目决定停止维护,并且不建议多使用包括RxBus在内的事件总线等。


Android RxBus

该项目基于RxJava2 & RxAndroid,并且从AndroidKnife/RxBus中学习而实现的。

使用annotation processing(注释处理)自动生成模板代码,避免了反射带来的性能影响。通过@Subscribe标记订阅方法,@Rxthread可设置订阅方法的运行线程,线程支持RxJava中提供的6种线程MainThreadIOComputationSingleNewThreadTrampoline

引用

在gradle中加入:

dependencies {
  compile 'com.github.vitess:rxbus:2.0.2'
  annotationProcessor 'com.github.vitess:rxbus-compiler:2.0.2'
}

开发版本的快照可从Sonatype’s snapshots repository中找到。

使用

在类的初始化处使用RxBus.register注册,并在类销毁的地方使用RxBus.unregister注销。注册后的类中的方法即可使用@Subscribe注释标记,此后在类以外的地方即可通过RxBus.post发射数据到指定方法中。

当使用@Subscribe标记方法时,若不指定特定的tag,该方法将被默认的tag所标记。这一类被默认tag标记的方法可接收RxBus.post(Object value)发射数据,或者使用RxBus.post(Subscribe.DEFAULT , ${value})来显式发射。

For example:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RxBus.register(this);
        //TODO something
        ...

        findViewById(R.id.button).setOnClickListenernew(View.OnClickListener() {
            @Override
            public void onClick(View v) {
                RxBus.post("receiver1", 123);//post to receiver1
                RxBus.post("This is post to receiver2");//post to receiver2
                RxBus.post(new Object());//post to receiver3
                RxBus.post("receiver4", null);//post to receiver4
                RxBus.post(null);//post to receiver5
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        RxBus.unregister(this);
    }

    @Subscribe("receiver1")
    @RxThread(ThreadType.IO)
    public void receiver1(int random) {
        Log.i("RxBus", "receiver1:" + Thread.currentThread().getName());
    }

    @Subscribe
    @RxThread(ThreadType.Single)
    public void receiver2(String str) {
        Log.i("RxBus", "receiver2:" + Thread.currentThread().getName());
    }

    @Subscribe
    public void receiver3(Object obj) {
        Log.i("RxBus", "receiver3:" + Thread.currentThread().getName());
    }

    @Subscribe("receiver4")
    public void receiver4(){
       Log.i("RxBus", "receiver4:" + Thread.currentThread().getName());
    }

    @Subscribe
    public void receiver5(){
       Log.i("RxBus", "receiver5:" + Thread.currentThread().getName());
    }
}

限制

  1. 目前支持发送null值(虽然post方法标记了@NonNull)
  2. 不支持发送实现了Map、Collection接口的参数类型(如ArrayList、HashMap等),如果必须发送这种集合容器参数,请自实现实体类,集合容器作为成员变量,然后发送实体类参数

TODO

目前思路稍微有些瓶颈,如果有好点子或者有可改进的地方,欢迎pull request,thanks!

  • 增加单元测试
  • 优化Processor性能
  • 优化模板代码
  • 优化Processor的缓存方式和生成模式
  • 增加sticky事件支持
  • 根据使用方式分别生成不同的Observable,使用频率较少的用post方法发射,每次独立生成Single完成操作;使用频率较高且生命周期较长的使用continuePost方法发射,仅生成Processor完成操作
  • etc.

License

Copyright 2017 Vincent Tam

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
<think>我们正在处理关于Android系统日志中OplusJoystickManager警告的问题。用户提到“OplusJoystickManager handleApplicationSwitch 方法已弃用”的警告信息,并询问其含义。 首先,需要理解这个日志的背景: - OplusJoystickManager 是OPPO设备(或一加,因为一加现在属于OPPO)上特有的一个系统服务,用于管理游戏手柄等外设。 - handleApplicationSwitch 是该类中的一个方法。 “已弃用”在编程中意味着该方法已经过时,不推荐继续使用。通常,当某个方法被标记为弃用时,开发者会提供替代方案,并在未来的版本中移除该方法。 因此,这个警告日志表明: 1. 有代码(可能是某个应用或系统服务)正在调用已经被标记为弃用的方法`handleApplicationSwitch`。 2. 系统记录了这个调用,并发出警告,提醒开发者应该更新代码以使用新的方法。 可能的原因和影响: - **原因**:可能是某个应用或游戏使用了旧的API来检测手柄的切换事件,而该API在当前的系统版本中已被弃用。 - **影响**:虽然目前还能工作,但在未来的系统更新中可能会被移除,导致功能失效。此外,使用弃用的方法可能存在兼容性或性能问题。 解决方案建议: 1. **应用开发者**:检查调用堆栈,找到调用此方法的代码,并替换为新的API。需要查阅OPPO提供的相关开发文档,了解替代方法。 2. **普通用户**:如果只是看到这个日志,通常不需要担心,因为这是开发者需要解决的问题。但如果是频繁出现,可能会影响性能,可以尝试更新相关应用或游戏。 调试建议: - 获取完整的调用堆栈,以确定是哪个应用调用了这个方法: ```shell adb logcat -v threadtime | grep "OplusJoystickManager" ``` 数学表达: 如果我们要描述弃用方法的调用频率,我们可以用: 设$t$为时间,$f(t)$为在时间$t$内调用弃用方法的次数。如果$f(t)$过高,则可能引起性能问题: $$ \text{警告频率} = \frac{\Delta f}{\Delta t} $$ 当该频率超过某个阈值时,系统可能会记录更多警告。 相关问题: 1. Android中如何查找弃用方法的替代方案? 2. OplusJoystickManager在OPPO设备中扮演什么角色? 3. 如何屏蔽系统日志中的弃用警告? 4. 应用调用弃用API会导致哪些潜在问题? 注意:由于OplusJoystickManager是OPPO的专有实现,具体细节需要参考OPPO的官方文档或源码(如果开源)。</think>### Android系统日志分析:OplusJoystickManager弃用警告解析 #### 警告含义解析 您遇到的系统日志警告: ``` OplusJoystickManager handleApplicationSwitch 方法已弃用 ``` 表示**OPPO设备特有的游戏手柄管理服务中,某个关键方法已被标记为废弃**,具体含义如下: | 组件 | 说明 | |------|------| | **OplusJoystickManager** | OPPO设备特有的游戏手柄管理服务(ColorOS定制模块) | | **handleApplicationSwitch** | 处理应用切换时手柄输入重定向的方法 | | **已弃用(Deprecated)** | 该方法在最新系统版本中不再推荐使用 | #### 根本原因分析 此警告表明**系统检测到有代码仍在调用废弃的API**,主要由于: 1. **架构升级**:手柄事件处理改用`InputManagerService`统一管理 $$ \text{旧架构} \xrightarrow{\text{Android 12+}} \text{InputService集中管理} $$ 2. **权限变更**:新版本要求`MANAGE_GAME_CONTROLLER`权限替代旧权限[^1] 3. **性能优化**:旧方法采用同步处理导致主线程阻塞 $$ t_{\text{处理}} > 16\text{ms} \Rightarrow \text{丢帧}(FPS < 60) $$ 4. **兼容性问题**:旧方法无法处理折叠屏多窗口场景 #### 解决方案建议 1. **应用开发者适配** ```java // 废弃方法(勿用) joystickManager.handleApplicationSwitch(oldApp, newApp); // 替代方案(Android 12+) InputManager im = (InputManager)context.getSystemService(INPUT_SERVICE); im.switchGameControllerFocus(newApp); ``` 2. **系统服务更新** ```xml <!-- 在设备厂商配置中启用新服务 --> <service android:name=".OplusGameControllerService" android:permission="android.permission.MANAGE_GAME_CONTROLLER"/> ``` 3. **用户临时处理** ```shell # 禁用冲突模块(需root) adb shell pm disable com.oplus.joystickmanager ``` #### 调试建议 ```shell # 追踪调用堆栈 adb logcat -v threadtime | grep "OplusJoystickManager" # 检查输入事件流 adb shell dumpsys input ``` 在Android输入子系统演进中,OPPO逐步将手柄管理整合到AOSP标准框架,旧方法因无法处理`InputDevice`事件分发而被废弃[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值