如果没有看到您的代码,很难判断会发生什么。但首先想到的是您的网络请求发生在不同的线程上,因此您performFiltering()
可能会过早地返回一个空结果集。那时,publishResults()
正在返回空结果,并且您的下拉列表为空。稍后,您的 AsyncTask 将返回其结果,并将结果添加到适配器的列表中,但由于某种原因,它尚未显示。
不过,我认为您可能误解了对 AsyncTask 的需求。Filter 对象已经在执行类似于 AsyncTask 的操作: performFiltering()
在后台线程中完成,并publishResults()
在 performFiltering() 完成后从 UI 线程调用。所以你可以直接在 performFiltering() 中做你的网络请求,并将结果设置到 FilterResults 对象中,你不必担心网络请求太慢而导致你的 UI 出现问题。
另一种解决方案,稍微复杂一些,但这是我在我的 Filter 对象中所做的(由于现有架构在后台执行 API 调用,使用异步回调而不是 performFiltering 所需的阻塞/同步步骤( )),就是用一个带wait()/notify()的同步对象来做跨线程监控,所以效果和performFiltering()中直接做网络请求是一样的,但实际上是多线程发生的:
// in Filter class..
protected FilterResults performFiltering(CharSequence constraint) {
APIResult response = synchronizer.waitForAPI(constraint);
// ...
}
// callback invoked after the API call finishes:
public void onAPIComplete(APIResult results) {
synchronizer.notifyAPIDone(results);
}
private class Synchronizer {
APIResult result;
synchronized APIResult waitForAPI(CharSequence constraint) {
someAPIObject.startAsyncNetworkRequest(constraint);
// At this point, control returns here, and the network request is in-progress in a different thread.
try {
// wait() is a Java IPC technique that will block execution until another
// thread calls the same object's notify() method.
wait();
// When we get here, we know that someone else has just called notify()
// on this object, and therefore this.result should be set.
} catch(InterruptedException e) { }
return this.result;
}
synchronized void notifyAPIDone(APIResult result) {
this.result = result;
// API result is received on a different thread, via the API callback.
// notify() will wake up the other calling thread, allowing it to continue
// execution in the performFiltering() method, as usual.
notify();
}
}
但是,我认为您可能会发现最简单的解决方案是直接在 performFiltering() 方法中同步执行您的网络请求。上面的代码示例只是一种可能性,如果您已经为异步/回调驱动的 API 调用准备好了架构,并且您不想更改该行为以在 performFiltering() 中获得同步结果。