Nếu không nhìn thấy mã của bạn, thật khó để biết điều gì có thể xảy ra. Nhưng điều đầu tiên cần lưu ý là yêu cầu mạng của bạn đang xảy ra trên một chuỗi khác nhau và do đó, performFiltering()
của bạn có thể trả về kết quả trống sớm. Tại thời điểm đó, publishResults()
sẽ trả lại kết quả trống và danh sách thả xuống của bạn trống. Sau đó, AsyncTask của bạn sẽ nhận được kết quả của nó trở lại, và bạn thêm các kết quả vào danh sách của bộ điều hợp, nhưng vì một lý do nào đó, nó không được hiển thị.
Tôi nghĩ bạn có thể nhầm lẫn về nhu cầu về AsyncTask. Đối tượng Filter đã làm một cái gì đó tương tự như AsyncTask: performFiltering()
được thực hiện trong một chủ đề nền và publishResults()
được gọi từ chuỗi giao diện người dùng, sau khi performFiltering() được hoàn tất. Vì vậy, bạn có thể thực hiện yêu cầu mạng của mình trực tiếp trong performFiltering() và đặt kết quả vào đối tượng FilterResults và bạn sẽ không phải lo lắng về yêu cầu mạng quá chậm và gây ra các sự cố trong giao diện người dùng của mình.
Giải pháp thay thế, phức tạp hơn một chút, nhưng đó là những gì tôi đang làm trong đối tượng Bộ lọc của mình (do kiến trúc hiện có thực hiện cuộc gọi API trong nền, sử dụng gọi lại không đồng bộ thay vì chặn/đồng bộ cần thiết cho performFiltering()), là sử dụng đối tượng đã đồng bộ với wait()/notify() để thực hiện giám sát cross-thread, do đó, hiệu ứng cũng giống như thực hiện yêu cầu mạng trực tiếp trong performFiltering(), nhưng nó thực sự xảy ra nhiều chủ đề:
// 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();
}
}
Tuy nhiên, tôi nghĩ bạn có thể thấy yêu cầu mạng của bạn đồng bộ, trực tiếp trong phương thức performFiltering(). Ví dụ mã trên chỉ là một khả năng, nếu bạn đã có kiến trúc tại chỗ cho các cuộc gọi API không đồng bộ/gọi lại, và bạn không muốn thay đổi hành vi đó để có được các kết quả đồng bộ trong performFiltering().
Might trợ giúp nếu bạn thêm mã của mình. – Joe