Java 来自API的Android搜索建议

Java 来自API的Android搜索建议,java,android,Java,Android,我试图创建一个可搜索的活动,从GooglePlacesAPI获取结果,我创建了一个内容提供者,并将一些代码用于向google发出HTTP请求并解析结果 问题在于,web请求需要异步完成,以阻止它阻塞UI线程,当这样做时,内容提供者在web请求完成之前返回MatrixCursor,使结果在下次文本框更改时显示,而不是在文本实际更改时显示 这有什么办法吗 以下是我的搜索内容提供商代码: import java.io.UnsupportedEncodingException; import java

我试图创建一个可搜索的活动,从GooglePlacesAPI获取结果,我创建了一个内容提供者,并将一些代码用于向google发出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;
}

导入java.io.UnsupportedEncodingException;
导入java.net.urlcoder

导入org.json.JSONArray; 导入org.json.JSONException; 导入org.json.JSONObject

导入android.app.SearchManager; 导入android.content.ContentProvider; 导入android.content.ContentValues; 导入android.database.Cursor; 导入android.database.MatrixCursor; 导入android.net.Uri; 导入android.util.Log

导入com.loopj.android.http.*

公共类位置SuggestionProvider扩展了ContentProvider{ 私有静态最终字符串[]列={ “\u id”,//必须包含此列 SearchManager.SUGGEST\u COLUMN\u TEXT\u 1}; public MatrixCursor=新MatrixCursor(列); 公共位置建议提供程序() {

}
@凌驾
public int delete(Uri arg0、字符串arg1、字符串[]arg2){
返回0;
}
@凌驾
公共字符串getType(Uri){
返回null;
}
@凌驾
公共Uri插入(Uri、ContentValues){
返回null;
}
@凌驾
公共布尔onCreate(){
返回false;
}
@凌驾
公共游标查询(Uri Uri、字符串[]投影、字符串选择、字符串[]selectionArgs、字符串排序器){
如果(selectionArgs[0].length()>=2&&selectionArgs[0].length()<75)
{
AsyncHttpClient=新的AsyncHttpClient();
试一试{
Log.d(“bastimes”https://maps.googleapis.com/maps/api/place/autocomplete/json?input=“+URLEncoder.encode(selectionArgs[0].trim(),“UTF-8”)+”&传感器=false&key=AIzaSyCvGtqoDK_sobwg94ckojmnoc-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_sobwg94ckojmnoc-dzXr8WA&language=en-GB&components=country:GB”,新的AsyncHttpResponseHandler(){
@凌驾
成功时公共无效(字符串响应){
JSONObject jObject=null;
试一试{
jObject=新的JSONObject(响应);
JSONArray predictions=jObject.getJSONArray(“预测”);
对于(int i=0;i
}

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

query()是在主线程上执行的,至少在android中是这样-L@Guillaume我刚刚在Lollipop(Android L)的发行版上确认,查询没有在主线程上执行。您可以通过放置类似于
System.out.println(Looper.myLoop()==Looper.getMainLooper())的内容进行测试