2

Google Places API から結果を取得する検索可能なアクティビティを作成しようとしています。コンテンツ プロバイダーを作成し、Google への HTTP リクエストを実行して結果を解析するためのコードをいくつか配置しました。

問題は、UI スレッドのブロックを停止するために Web 要求を非同期で実行する必要があることです。このように実行すると、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;
}

}

4

1 に答える 1

6

いずれにしても、コンテンツ プロバイダーへの要求は UI スレッドで実行されないため、これを非同期で行う必要はありません。これは、非同期タスクや何をする必要もなく、通常どおり Web 要求を実行でき、正常に動作することを意味します。

于 2012-10-15T12:10:15.950 に答える