【发布时间】:2021-06-08 19:07:27
【问题描述】:
在我的 Activity B 中,我调用了一个名为 myASYNC 的异步方法,该方法从 API 获取数据(数据量足够大,加载所有数据需要几秒钟)。如果我在myASYNC 仍在运行时单击将我带回活动A 的Android 后退按钮,我会收到此错误并且应用程序崩溃:
E/AndroidRuntime: FATAL EXCEPTION: RxCachedThreadScheduler-3
Process: com.hfad.crypto, PID: 9473
java.lang.NullPointerException: Callable returned a null value. Null values are generally not allowed in 3.x operators and sources.
只有在我的方法运行时退出 Activity“B”时才会发生这种情况,即使它应该被 Disposed:
@Override
protected void onDestroy() {
super.onDestroy();
if(disposableMain != null && !disposableMain.isDisposed()){
disposableMain.dispose();
Log.d("Disposable", "disposed");
}
}
活动“B”
public class ActivityB extends AppCompatActivity {
private Disposable disposableMain;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
myASYNC("DATA");
}
private void myASYNC(String data){
Observable.fromCallable(() -> {
try {
URL url1 = new URL(data);
HttpURLConnection connection = (HttpURLConnection) url1
.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
return BitmapFactory.decodeStream(input);
} catch (IOException e) {
e.printStackTrace();
Log.d("JSONTask failed", "task failed" + e.toString());
return null;
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new io.reactivex.rxjava3.core.Observer<Bitmap>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
disposableMain = d;
}
@Override
public void onNext(@NonNull Bitmap bitmap) {
bitmapList.add(bitmap);
}
@Override
public void onError(@NonNull Throwable e) {
e.printStackTrace();
}
@Override
public void onComplete() {}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
if(disposableMain != null && !disposableMain.isDisposed()){
disposableMain.dispose();
Log.d("Disposable", "disposed");
}
}}
如何防止这种情况发生?
【问题讨论】:
标签: java android rx-java rx-android