0

このチュートリアルにかなり厳密に従って、API を使用して Google プレイスのオートコンプリートを実装しました - https://developers.google.com/places/training/autocomplete-android。私の質問は、マルチスレッド作業が行われていないのに、なぜこれが機能するのですか - asynchTasks などはありません。メイン スレッドからの http 要求があるため、アプリがクラッシュしていませんか? アプリがクラッシュすると思われる行は次のとおりです-

conn = (HttpURLConnection) url.openConnection();
4

1 に答える 1

5

ネットワーク呼び出しはFilter.performFilteringメソッド内で実行されます。

@Override
public Filter getFilter() {
    Filter filter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults filterResults = new FilterResults();
            if (constraint != null) {
                // Retrieve the autocomplete results.
                resultList = autocomplete(constraint.toString());

                // Assign the data to the FilterResults
                filterResults.values = resultList;
                filterResults.count = resultList.size();
            }
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            if (results != null && results.count > 0) {
                notifyDataSetChanged();
            }
            else {
                notifyDataSetInvalidated();
            }
        }};
    return filter;
}

ドキュメントからわかるように、Filter.performFiltering()メソッドはワーカー スレッド内で実行されます。

ワーカー スレッドで呼び出され、制約に従ってデータをフィルター処理します。フィルタリング操作を実行するには、サブクラスでこのメソッドを実装する必要があります。フィルタリング操作によって計算された結果は、 として返される必要があります。Filter.FilterResultsこれは、 を介して UI スレッドでパブリッシュされますpublishResults(CharSequence, android.widget.Filter.FilterResults)

于 2013-04-27T07:44:05.443 に答える