一个返回值为User的方法,在内部调用了异步方法(比如Rxjava,或者异步的网络请求),其内部匿名函数内才能拿到user对象,那么我的方法应该怎么return这个对象?
天蓬老师2017-04-18 09:53:32
メソッドの戻り値は user であるため、このメソッドは非同期メソッドとは言えません。このメソッドがフューチャー、または後で結果を取得できる参照のようなものを返さない限り、このメソッドは非同期メソッドと呼ぶことができます。メソッドを調整した後にユーザーを取得したい場合は、メソッドに非同期コードを配置する必要はありませんが、まったく意味がありません。
非同期結果はコールバックを通じてのみ返されます。
同期方法は通常こんな感じです
リーリーheavyWork メソッドはデータベースのチェックや大量の計算を必要とする場合があるため、heavyWork メソッドの実行には時間がかかります。
長時間待ちたくない場合は、非同期が便利です。
この時点で、heavyWork は別のスレッドに渡されて実行され、Future が返されます。
その後、この将来の get メソッドを通じて必要なユーザーを取得できます。
これが非同期の意味と有用性です。タイトル自体が矛盾しています。非同期コードを含むメソッドで非同期実行の結果を返すことは矛盾します。
阿神2017-04-18 09:53:32
私は RxJava を勉強したことはありませんが、前のチームで Android 開発をしていた同僚は、RxJava がとても便利だと言いました。
1階ではFutureを使った解決策を紹介しましたが、残念ながらFutureは非同期ブロッキングAPI、つまり通知コールバックがありません。
コールバックの実装方法については、オブザーバー パターンを見てください。本質は、インターフェイスの多態性の特性を使用することです。
ただし、ListenableFuture と呼ばれる強化された Future を提供する Google guava を使用することもできます。
1階の作例を引用し、修正させていただきました。
リーリーPHP中文网2017-04-18 09:53:32
CountDownLatch を使用して、非同期操作を同期操作に変換します。
最終 CountDownLatch ラッチ = 新しい CountDownLatch(1);
非同期メソッドを呼び出します。非同期コールバック結果では、
latch.countDown()
{
を試してください
リーリー
}
阿神2017-04-18 09:53:32
rx.java は使用したことがありません
ですが、Android でのメソッドは知っています。お役に立てれば幸いです。
おっしゃるとおり、メインメソッドで非同期の戻り結果を使う場合は、スレッド間の通信を考慮する必要があるとのことです
つまり、ハンドラを先に書いて、データを受け取るメソッドを書いて実行するということになります。データが到着したらメソッド
を実行し、サブスレッドの完了後にデータをハンドラーに送信します。