假设我有以下代码:
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
和{ {1}}完全相同。
但是,日志清楚地表明,callbackTID
是在之前 "Marker 3"
打印的,据我所知,这毕竟是异步回调。怎么会这样?我对Java(和android)非常陌生,所以也许我在这里缺少一些关键的基础知识。
如何实现一种等待回调的方法?我用"Marker 2"
进行了尝试,该方法只是在CoundDownLatch
方法中递减并在onSuccess
日志打印之前等待,但是正如我期望的那样,我卡住了,因为显然回调在与正在等待的线程相同。
感谢您可能提供的任何提示或解决方案;)
答案 0 :(得分:0)
您应该阅读异步编程及其工作原理。
示例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。
注意:这只是伪代码,显示了如何实现。