我正在使用PlacesSearchBar提供自动完成选项来查找我的Xamarin Forms应用程序中的位置。
从组件的角度来看,这工作正常,但是谷歌API在一两次尝试后返回了我OVER_QUERY_LIMIT
。
我想我知道这里的问题是什么,这个组件每秒对这个谷歌 API 进行多次调用,这使我成为谷歌逻辑上的可疑模式,它开始向我返回OVER_QUERY_LIMIT
状态。但是,我无法看到如何在这些呼叫之间引入延迟。
这是我如何使用这个组件。
<searchplaces:PlacesBar x:Name="edtSearch" MinimumSearchText="6" ApiKey="<API KEY>" Placeholder="Please enter your destination address"></searchplaces:PlacesBar>
<AbsoluteLayout>
<ActivityIndicator x:Name="spinner" IsRunning="false" AbsoluteLayout.LayoutBounds="0.5, 0.1, 50, 50" AbsoluteLayout.LayoutFlags="PositionProportional" />
<ListView x:Name="lvPlaces" ItemsSource="{Binding .}" RowHeight="60"
VerticalOptions="CenterAndExpand" HorizontalOptions="CenterAndExpand"
IsVisible="False" AbsoluteLayout.LayoutBounds="0, 0, 1, 1" AbsoluteLayout.LayoutFlags="SizeProportional">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout BackgroundColor="#2B2C30" Orientation="Vertical" Margin="0,0,0,2" Padding="5,5,5,5" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" >
<Label Text="{Binding Description}" TextColor="#EAEDF7" FontSize="Medium" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"/>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</AbsoluteLayout>
在我的.cs
构造函数上,我有这个:
edtSearch.TextChanged += async (sender, e) =>
{
if (!string.IsNullOrEmpty(e.NewTextValue) && (e.NewTextValue.Length >= edtSearch.MinimumSearchText))
{
lvPlaces.IsVisible = false;
spinner.IsVisible = true;
spinner.IsRunning = true;
edtSearch.IsReadOnly = true; // try 1: to introduce delay
await Task.Delay(800);
}
else
{
lvPlaces.IsVisible = true;
spinner.IsRunning = false;
spinner.IsVisible = false;
edtSearch.IsReadOnly = false;
}
};
edtSearch.PlacesRetrieved = async (sender, result) =>
{
this.BindingContext = result.AutoCompletePlaces;
spinner.IsRunning = false;
spinner.IsVisible = false;
edtSearch.IsReadOnly = false;
if (result.AutoCompletePlaces != null && result.AutoCompletePlaces.Count > 0)
lvPlaces.IsVisible = true;
if (result.Status == "OVER_QUERY_LIMIT")
{
await Task.Delay(2000); // try 2: to introduce delay
}
};
edtSearch.MinimumSearchText = 6;
在PlacesSearchBar 组件代码上,我看到以下逻辑:
async void OnTextChanged(object sender, TextChangedEventArgs e)
{
if (!string.IsNullOrEmpty(e.NewTextValue) && e.NewTextValue.Length >= MinimumSearchText)
{
var predictions = await Places.GetPlaces(e.NewTextValue, ApiKey, Bias, Components, Type, Language);
if (PlacesRetrieved != null && predictions != null)
OnPlacesRetrieved(predictions);
else
OnPlacesRetrieved(new AutoCompleteResult());
}
else
{
OnPlacesRetrieved(new AutoCompleteResult());
}
}
由于这是一个事件,因此无论我从此组件外部执行什么操作,它都不会影响原始组件的此行为。
有人可以帮我如何在使用此Auto complete text box
时克服此OVER_QUERY_LIMIT
.
问候 基兰
我认为我们设法解决了这个问题,问题是我们没有将我们的项目连接到计费帐户,因此谷歌允许每秒有一个大约 1 个请求的最小请求。
一旦我们连接到计费帐户,这至少现在开始工作。