【问题标题】:E/AndroidRuntime: FATAL EXCEPTION: RxCachedThreadScheduler-3 Callable returned a null valueE/AndroidRuntime: FATAL EXCEPTION: RxCachedThreadScheduler-3 Callable 返回一个空值
【发布时间】: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


    【解决方案1】:

    正如例外所说,您正在从 Callable 中返回 null

    首先,从catch 块中删除返回nulltry-catch 构造。您可以在观察者的onError 中处理异常。 (请注意,有关“JSONTask”的日志记录也具有误导性。)

    其次,BitmapFactory.decodeStream() 也可以失败并返回null。您可以使用例如将其变为异常将其包装在 Objects.requireNonNull() 中。

    【讨论】:

    • 感谢您的回复,当删除 try-catch 时我仍然收到错误消息,并且应用程序崩溃,同时删除 try-catch 并使用对象包装 BitmapFactory.decodeStream() 时也是如此。 requireNonNull().
    • 那应该是不同的崩溃和不同的堆栈跟踪。
    • 问题可能是我不知道如何处理“OnError”中的这些错误
    • //java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on an null object reference //当你的两个提示都是应用
    • 所有异常都会传递给错误消费者。你能告诉我们修改后的代码吗?
    猜你喜欢
    • 2016-07-14
    • 2017-02-18
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多