假设我有以下代码:
private void getResource(String mac, String resource) {
int threadID = android.os.Process.myTid();
Log.e( "", "Marker 1" );
Mds.builder().build(mContext).get(SCHEME_PREFIX + mac + resource, null, new MdsResponseListener() {
@Override
public void onSuccess(String data, MdsHeader header) {
Log.e( "", "Marker 2" );
int callbackTID = android.os.Process.myTid();
if( callbackTID == threadID) {
Log.e("", "Same Thread");
}
else{
Log.e("", "Different Thread");
}
}
});
Log.e( "", "Marker 3" );
}我在new MdsResponseListener中指定的回调似乎是在对get(...)进行整体函数调用的线程中执行的,因为threadID和callbackTID是相同的。
但是,日志清楚地表明,"Marker 3"是在"Marker 2"之前打印的,据我理解,这告诉我这毕竟是一个异步回调。这怎么可能呢?我对java (和android)非常陌生,所以我可能错过了一些关键的基础知识。
如何实现等待回调的方法?我尝试了一个CoundDownLatch,它简单地在onSuccess方法中进行计数,在"Marker 3"日志打印之前等待,但是正如我所预期的,我被卡住了,因为显然回调运行在与等待的线程相同的线程中。
发布于 2019-01-18 08:44:52
您应该了解异步编程及其工作原理。
示例1:
Log.e( "", "Marker 1" );
Mds.builder().build(mContext).get(SCHEME_PREFIX + mac + resource, null, new MdsResponseListener() {
@Override
public void onSuccess(String data, MdsHeader header) {
Log.e( "", "Marker 2" );
doSomething() // Your method call when response is ready
});
private void doSomething() {
Log.e( "", "Marker 3" );
}
}例2( RxJava )
Obserable.create( source ->
Mds.builder().build(mContext).get(SCHEME_PREFIX + mac + resource, null, new MdsResponseListener() {
@Override
public void onSuccess(String data, MdsHeader header) {
source.onNext(data)
source.onComplete()
});
)然后订阅此可观察到的内容,您可以使用subscribeOn / observeOn。
注意:这只是伪代码,显示了如何实现。
https://stackoverflow.com/questions/51125055
复制相似问题