Android AutocompleteTextView适配器,用于具有回调的异步API

时间:2017-02-08 13:10:28

标签: android autocompletetextview

我正在通过一些REST API实现自动完成建议(它实际上是Nokia Here Geocoder Autocomplete API,但它并不那么重要)。我为NSDictionary *headers = @{@"content-type": @"application/x-www-form-urlencoded", @"authorization": @"Digest username=\"admin\", realm=\"REST API\", nonce=\"1\", uri=\"/restserver/index.php/welcome/login\", qop=auth, nc=1, cnonce=\"1\", response=\"e35d1ebfcfa17a119ee0b45c6703cb8e\", opaque=\"1\"", @"cache-control": @"no-cache" }; NSMutableData *postData = [[NSMutableData alloc] initWithData:[[NSString stringWithFormat:@"empcode=divya.p@ecreeds.com"] dataUsingEncoding:NSUTF8StringEncoding]]; [postData appendData:[[NSString stringWithFormat:@"&password=cc03e747a6afbbcbf8be7668acfebee5"] dataUsingEncoding:NSUTF8StringEncoding]]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://canteen.mostlovedcountry.com/restserver/index.php/welcome/login"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0]; [request setHTTPMethod:@"POST"]; [request setAllHTTPHeaderFields:headers]; [request setHTTPBody:postData]; NSURLSession *session = [NSURLSession sharedSession]; NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if (error) { NSLog(@"%@", error); } else { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; NSLog(@"%@", httpResponse); NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; NSLog(@"%@", dic); } }]; [dataTask resume]; 编写自定义适配器。

AutoCompleteTextView

据我所知,第public class GeoAutocompleteAdapter extends BaseAdapter implements Filterable { @Override public Filter getFilter() { Filter filter = new Filter() { @Override protected Filter.FilterResults performFiltering(CharSequence constraint) { FilterResults filterResults = new FilterResults(); // obtain some autocomplete data filterResults.values = res; filterResults.count = res.size(); return filterResults; } //... } //... } 节在线程池中运行。如果我以同步方式获得自动完成的结果 - 它的工作。例如,我可以使用"obtain some autocomplete data"HttpURLConnection - 所有同步阻塞调用在这里工作得很好。

但是如果我需要在这里调用一些API,它们以异步方式运行,比如通过Callback \ Listener?

如何在performFiltering中调用类似的内容?

InputStream

我怎样才能推迟从方法返回,而回调却没有给我一个结果?

提前致谢,

1 个答案:

答案 0 :(得分:2)

您可以让线程在performFiltering方法中等待异步API的结果,直到收到响应。

由于方法performFiltering在一个工作线程中运行,你可以让线程等待结果,如下所示,lockTwo是object和placeResults布尔指示符。

        while (!placeResults) {
            synchronized (lockTwo) {
                try {
                    lockTwo.wait();
                } catch (InterruptedException e) {

                }
            }
        } 

在回调或监听器中,一旦处理了响应,就按如下所示添加notify。

                placeResults = true;
                synchronized (lockTwo) {
                    lockTwo.notifyAll();
                }

有关详细信息,您可以在http://www.zoftino.com/google-places-auto-complete-android

查看地点自动搜索示例