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> T json2Object(String text, Class<T> clazz) {
        return JSON.parseObject(text, clazz);
    }

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

    @Override
    public <T> 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修饰
以上两点在官方指导中都没有明确写明,初学者很容易掉进坑里面。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,794评论 1 32
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 7,038评论 0 4
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,846评论 6 13
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 4,746评论 0 4
  • JAVA面试题 1、作用域public,private,protected,以及不写时的区别答:区别如下:作用域 ...
    JA尐白阅读 4,857评论 1 0