gpt4 book ai didi

java - 来自 API 的 Android 搜索建议

转载 作者:搜寻专家 更新时间:2023-11-01 07:34:54 25 4
gpt4 key购买 nike

我正在尝试创建一个从 google places API 获取结果的可搜索 Activity ,我创建了一个内容提供程序并放置了一些代码来向 google 发出 HTTP 请求并解析结果。

问题是 Web 请求需要异步完成以阻止它阻塞 UI 线程,当它像这样完成时,内容提供者在 Web 请求完成之前返回 MatrixCursor 使结果出现在下一次文本框发生变化,而不是文本实际发生变化时发生变化。

有什么办法解决这个问题吗?

这是我的搜索内容提供商的代码:


import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;<p></p>

<p>import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;</p>

<p>import android.app.SearchManager;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.net.Uri;
import android.util.Log;</p>

<p>import com.loopj.android.http.*;</p>

<p>public class LocationsSuggestionProvider extends ContentProvider {
private static final String[] COLUMNS = {
"_id", // must include this column
SearchManager.SUGGEST_COLUMN_TEXT_1};
public MatrixCursor cursor = new MatrixCursor(COLUMNS);
public LocationsSuggestionProvider()
{</p>

<pre><code>}
@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
return 0;
}

@Override
public String getType(Uri uri) {

return null;
}

@Override
public Uri insert(Uri uri, ContentValues values) {
return null;
}

@Override
public boolean onCreate() {
return false;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
if(selectionArgs[0].length() >= 2 && selectionArgs[0].length() < 75)
{
AsyncHttpClient client = new AsyncHttpClient();
try {
Log.d("Bustimes","https://maps.googleapis.com/maps/api/place/autocomplete/json?input="+ URLEncoder.encode(selectionArgs[0].trim(), "UTF-8") +"&sensor=false&key=AIzaSyCvGtqoDK_SoBWG94CKOjymnOc-dzXr8WA&language=en-GB&components=country:gb");
client.get("https://maps.googleapis.com/maps/api/place/autocomplete/json?input="+ URLEncoder.encode(selectionArgs[0].trim(), "UTF-8") +"&sensor=false&key=AIzaSyCvGtqoDK_SoBWG94CKOjymnOc-dzXr8WA&language=en-GB&components=country:gb", new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
JSONObject jObject = null;
try {
jObject = new JSONObject(response);

JSONArray predictions = jObject.getJSONArray("predictions");
for(int i = 0;i < predictions.length(); i++)
{
JSONObject prediction = predictions.getJSONObject(i);
LocationsSuggestionProvider.this.cursor.addRow(new Object[] {i,prediction.getString("description").toString()});
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
MatrixCursor returnMatrix = cursor;
cursor = new MatrixCursor(COLUMNS);
return returnMatrix;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
return 0;
}
</code></pre>

<p>}
</p>

最佳答案

事实证明,您不需要异步执行任何这些操作,因为对内容提供者的请求无论如何都不会在 UI 线程上运行。这意味着您可以正常执行 Web 请求,而无需异步任务或任何您想做的事情,它会正常工作。

关于java - 来自 API 的 Android 搜索建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12883071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com