来自API的Android搜索建议

我正在尝试创建一个可搜索的活动,从谷歌地方API获得结果,我已经创建了一个内容提供商并放置一些代码来执行HTTP请求谷歌并解析结果。

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

有没有办法解决?

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

import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; 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; import com.loopj.android.http.*; 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() { } @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; } } 

import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; 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; import com.loopj.android.http.*; 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() { } @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; } }

import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; 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; import com.loopj.android.http.*; 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() { } @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; } }

import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; 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; import com.loopj.android.http.*; 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() { } @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; } }

import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; 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; import com.loopj.android.http.*; 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() { } @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; } }

 import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; 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; import com.loopj.android.http.*; 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() { } @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; } } 

import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; 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; import com.loopj.android.http.*; 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() { } @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; } }

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