2014-02-18 4 views
0

Я следую вместе с this tutorial о том, как использовать API Google Адресов с автоматическим заполнением в Android.Создание запроса Json и получение объектов Json

Получает описание прогнозов и сохраняет их в массиве, который будет отображаться, когда пользователь вводит строку.

private ArrayList<String> autocomplete(String input) { 
     ArrayList<String> resultList = null; 

     HttpURLConnection conn = null; 
     StringBuilder jsonResults = new StringBuilder(); 
     try { 
      URL mUrl = new URL(PLACES_API_BASE + 
        TYPE_AUTOCOMPLETE + 
        OUT_JSON + 
        "?sensor=false&key=" + 
        API_KEY + 
        "&components=country:us" + 
        "&input=" + 
        URLEncoder.encode(input, "utf8")); 

      conn = (HttpURLConnection) mUrl.openConnection(); 
      InputStreamReader in = new InputStreamReader(conn.getInputStream()); 

      // Load the results into a StringBuilder 
      int read; 
      char[] buff = new char[1024]; 
      while ((read = in.read(buff)) != -1) { 
       jsonResults.append(buff, 0, read); 
      } 
     } catch (MalformedURLException e) { 
      Log.e(LOG_TAG, "Error processing Places API URL", e); 
      return null; 
     } catch (IOException e) { 
      Log.e(LOG_TAG, "Error connecting to Places API", e); 
      return null; 
     } finally { 
      if (conn != null) { 
       conn.disconnect(); 
      } 
     } 

     try { 
      // Create a JSON object hierarchy from the results 
      JSONObject jsonObj = new JSONObject(jsonResults.toString()); 
      mPredictionsJsonArray = jsonObj.getJSONArray("predictions"); 

      // Extract the Place descriptions from the results 
      resultList = new ArrayList<String>(mPredictionsJsonArray.length()); 
      for (int i = 0; i < mPredictionsJsonArray.length(); i++) { 
       resultList.add(mPredictionsJsonArray.getJSONObject(i).getString("description")); 
      } 
     } catch (JSONException e) { 
      Log.e(LOG_TAG, "Error processing Places API URL", e); 
     } finally { 
      if (conn != null) { 
       conn.disconnect(); 
      } 
     } 

     return resultList; 
    } 

тогда, когда пользователь нажимает на предложение;

@Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
     //String reference = "https://maps.googleapis.com/maps/api/place/details/json?reference="; 
     //String photo = "https://maps.googleapis.com/maps/api/place/photo?maxwidth=70&photoreference="; 

     try { 
      REFERENCE = mPredictionsJsonArray.getJSONObject(position).getString("reference"); 
     } catch (JSONException e) { 
      Log.e(LOG_TAG, "Error processing Places API URL", e); 
     } 

     HttpURLConnection conn = null; 
     StringBuilder jsonResults = new StringBuilder(); 

     try { 
      REFERENCE = mPredictionsJsonArray.getJSONObject(position).getString("reference"); 
     } catch (JSONException e) { 
      Log.e(LOG_TAG, "Error processing Places API URL", e); 
     } 

     try { 
      URL mUrl = new URL("https://maps.googleapis.com/maps/api/place/details/json?reference=" + 
        REFERENCE + 
        "?sensor=false&key=" + 
        API_KEY); 

      conn = (HttpURLConnection) mUrl.openConnection(); 
      InputStreamReader in = new InputStreamReader(conn.getInputStream()); 

      // Load the results into a StringBuilder 
      int read; 
      char[] buff = new char[1024]; 
      while ((read = in.read(buff)) != -1) { 
       jsonResults.append(buff, 0, read); 
      } 

     } catch (MalformedURLException e) { 
      Log.e(LOG_TAG, "Error processing Places API URL", e); 
     } catch (IOException e) { 
      Log.e(LOG_TAG, "Error connecting to Places API", e); 
     } finally { 
      if (conn != null) { 
       conn.disconnect(); 
      } 
     } 
    } 

LogCat

02-18 10:59:27.775 2081-2081/com.example.project.thisthat E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.example.project.thisthat, PID: 2081 
    android.os.NetworkOnMainThreadException 
      at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145) 
      at com.android.org.conscrypt.OpenSSLSocketImpl.close(OpenSSLSocketImpl.java:1009) 
      at com.android.okhttp.Connection.close(Connection.java:175) 
      at com.android.okhttp.internal.Util.closeQuietly(Util.java:110) 
      at com.android.okhttp.internal.http.HttpEngine.release(HttpEngine.java:447) 
      at com.android.okhttp.internal.http.HttpURLConnectionImpl.disconnect(HttpURLConnectionImpl.java:104) 
      at com.android.okhttp.internal.http.HttpsURLConnectionImpl.disconnect(HttpsURLConnectionImpl.java:124) 
      at com.example.project.thisthat.PollActivity.onItemClick(PollActivity.java:175) 
      at android.widget.AutoCompleteTextView.performCompletion(AutoCompleteTextView.java:902) 
      at android.widget.AutoCompleteTextView.access$500(AutoCompleteTextView.java:91) 
      at android.widget.AutoCompleteTextView$DropDownItemClickListener.onItemClick(AutoCompleteTextView.java:1192) 
      at android.widget.AdapterView.performItemClick(AdapterView.java:299) 
      at android.widget.AbsListView.performItemClick(AbsListView.java:1113) 
      at android.widget.AbsListView$PerformClick.run(AbsListView.java:2904) 
      at android.widget.AbsListView$3.run(AbsListView.java:3638) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5017) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
      at dalvik.system.NativeStart.main(Native Method) 

Я могу получить идентификационный номер для выбранного элемента, однако, когда я пытаюсь повторить приведенный выше код в функции onItemClick(), я получаю фатальную ошибку и сила приложения закрывается. Я пытаюсь в конечном итоге получить URL-адрес фотографии для выбранного места.

+0

пожалуйста, поделитесь результат LogCat и код, который вы используете внутри 'onItemClick' называть' autocomplete' –

+0

Я думаю NetworkOnMainThreadException;) –

+0

@ ρяσѕρєяK обновляется полный код и logcat –

ответ

1

Как упоминалось в других, вы можете создать новую AsyncTask в каждом OnItemClick. За кулисами система Android совместно использует потоки для AsyncTasks.

0

вы получаете:

android.os.NetworkOnMainThreadException 

, что означает, что вы пытаетесь выполнить сетевой вызов на главном потоке, лучший подход должен был бы использовать AsyncTask и получить данные в AsyncTask, а затем отправить данные из метода onPostExecute() для асинтезы в основной поток для обновления пользовательского интерфейса.

Ссылки на asyncTask [1], [2].

[1] http://www.vogella.com/tutorials/AndroidBackgroundProcessing/article.html

[2] http://www.compiletimeerror.com/2013/01/why-and-how-to-use-asynctask.html#.UwQ2J2KSx1Y

Смежные вопросы