我正在通过一些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
我怎样才能推迟从方法返回,而回调却没有给我一个结果?
提前致谢,
答案 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
查看地点自动搜索示例