Retrofit+RxJava调用ApiInterface.getArea时触发空指针异常求助
问题排查与解决
核心错误原因
空指针异常的直接原因是MainActivity中的apiInterface变量未初始化就调用了getArea()方法——你仅声明了这个变量,但未给它赋值,导致它处于null状态。
修复步骤
1. 初始化ApiInterface实例
在MainActivity的onCreate方法中,通过ApiClient获取Retrofit实例,再生成ApiInterface的实现类:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化apiInterface apiInterface = ApiClient.getClient().create(ApiInterface.class); Disposable disposable = apiInterface.getArea("4744",".") .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(this::handlerResponse,this::handlerError); }
2. 优化接口注解(可选但推荐)
ApiInterface中@GET("aree/getAree?")的末尾无需添加问号,Retrofit会自动处理查询参数的拼接,修改为:
@GET("aree/getAree") Observable<ResponseArea> getArea(@Query("p1") String code, @Query("p2") String param);
3. 管理Disposable避免内存泄漏(可选但推荐)
使用CompositeDisposable统一管理RxJava的Disposable,在Activity销毁时清理资源:
public class MainActivity extends AppCompatActivity { private ApiInterface apiInterface; private CompositeDisposable compositeDisposable = new CompositeDisposable(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); apiInterface = ApiClient.getClient().create(ApiInterface.class); Disposable disposable = apiInterface.getArea("4744",".") .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(this::handlerResponse,this::handlerError); compositeDisposable.add(disposable); } @Override protected void onDestroy() { super.onDestroy(); compositeDisposable.dispose(); } // 原有handlerResponse、handlerError方法不变 }
额外检查点
- 确认
ApiClient中的HTTPS_PATH是正确的基础URL,且必须以/结尾(例如https://your-domain.com/api/) - 确保项目已正确引入所需依赖:RxJava2、Retrofit、RxJava2CallAdapterFactory、GsonConverterFactory等
内容的提问来源于stack exchange,提问作者Scripta14
相关产品推荐
相关产品推荐

