ARouter 传递自定义对象时报空指针异常的坑

1、先按照Arouter官方指导添加相关的依赖:

implementation 'com.alibaba:arouter-api:1.5.0'
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
implementation 'com.alibaba:fastjson:1.2.48'

2、自定义一个Application,在里面initArouter,并添加到AndroidMainfest

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // 这两行必须写在init之前,否则这些配置在init过程中将无效
        if (BuildConfig.DEBUG) {
            // 打印日志
            ARouter.openLog();
            // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
            ARouter.openDebug();
        }
        ARouter.init(this);
    }
}

3、生成一个JavaBean对象,内容很简单

public class Persion {

    int age;
    String name;

    public Persion(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Persion{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    protected void doSomething(){
        Log.i("persion", "doSomething: ");
    }
}

5、按照官方的说明:
如果需要传递自定义对象,新建一个类(并非自定义对象类),然后实现SerializationService,并使用@Route注解标注(方便用户自行选择序列化方式)
添加一个JsonServiceImpl类并实现SerializationService接口(自动生成几乎不需要自己做什么)

public class JsonServiceImpl implements SerializationService {
    @Override
    public void init(Context context) {

    }

    @Override
    public  T json2Object(String text, Class clazz) {
        return JSON.parseObject(text, clazz);
    }

    @Override
    public String object2Json(Object instance) {
        return JSON.toJSONString(instance);
    }

    @Override
    public  T parseObject(String input, Type clazz) {
        return JSON.parseObject(input, clazz);
    }
}

6、MainActivity中开始跳转并传递对象

  Persion obj = new Persion(17, "jacky");
                ARouter.getInstance().build(Constants.PATH_MODULE_SECOND_ACTIVITY)
                        .withObject("obj",obj)
                        .navigation();

7、SecondActivity中接收对象

@Route(path = Constants.PATH_MODULE_SECOND_ACTIVITY)
public class SecondActivity extends AppCompatActivity {
    @Autowired
    Persion obj;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        ARouter.getInstance().inject(this);
        Log.i("persion", "onCreate: "+obj.name);
        Log.i("persion", "onCreate: "+obj.age);
    }
}

但是运行起来,接收的obj始终是null。

和官方的demo对比,发现JavaBean对象需要添加一个无参的构造方法

    public Persion(){

    };

再次运行,这回不报空了,但是传过来的对象变量都是默认值
后来发现,JavaBean对象在定义变量时一定要是public,其他修饰词都会导致无法正常接收值。

修改后,一切正常

    public int age;
    public String name;
image.png

总结:
1、自定义的JavaBean对象一定要包含一个无参的构造方法
2、自定义的JavaBean对象一定要用public修饰
以上两点在官方指导中都没有明确写明,初学者很容易掉进坑里面。

你可能感兴趣的:(ARouter 传递自定义对象时报空指针异常的坑)