Java将异步调用转换为同步调用

调用外部的Api时,根据自己业务需求有时需要同步调用,如果这些Api没有提供同步调用的方法,此时该如何转同步调用呢

下面提供一种Java中的实现方式:

public class AsyncCallback {
    private Boolean finished = null;

    public AsyncCallback call() {
        new Thread() {
            @Override
            public void run() {
                synchronized (AsyncCallback.this) {
                    try {
                        Thread.sleep(3000);

                        finished = true;
                    } catch (InterruptedException ignore) {
                        finished = false;
                    }
                    AsyncCallback.this.notifyAll();
                }
            }
        }.start();

        return this;
    }

    public boolean isFinished() {
        synchronized (this) {
            while (finished == null) {
                try {
                    wait();
                } catch (InterruptedException ignore) {
                }
            }
        }

        return finished;
    }

    public static Observable<Boolean> asyncCall() {
        return Observable.defer(new Callable<ObservableSource<? extends Boolean>>() {
            @Override
            public ObservableSource<? extends Boolean> call() throws Exception {
                return Observable.just(new AsyncCallback().call().isFinished());
            }
        });
    }

    @SuppressLint("CheckResult")
    public static void testAsync2Sync() {
        asyncCall().subscribeOn(Schedulers.computation())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(new Consumer<Disposable>() {
                    @Override
                    public void accept(Disposable disposable) throws Exception {
                        Log.e("HTTP-LOG", "start call sync method");
                    }
                })
                .subscribe(new Consumer<Boolean>() {
                    @Override
                    public void accept(Boolean aBoolean) throws Exception {
                        Log.e("HTTP-LOG", "sync call returned, " + aBoolean);
                    }
                });
    }

通过这样的转换,就可以将异步接口转换为同步调用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容