Android Studio - синтаксический анализ JSON из Google Адресов Google Адресов. Номер телефона дает нулевое значение при первом запуске - PullRequest
0 голосов
/ 21 апреля 2020

Немного странная проблема здесь. В настоящее время у меня есть действие, которое получает имена и идентификаторы мест всех компаний такси с помощью API поиска Google Адресов и помещает их в список. Затем при щелчке элемента он получает идентификатор места и запускает API сведений о местах, чтобы получить номер телефона.

В настоящее время я сталкиваюсь с проблемой, когда при первом нажатии элемента в списке просмотра отображается JSON парсер вернет NULL и телефон наберет номер, например 6855 или 685-5. Если вы go вернетесь и нажмете на тот же элемент или другой элемент, тогда номер телефона будет выбран правильно.

В упражнении я использую 2 JSON парсеров, однако они запускаются в разное время.

onCreate:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_taxi);
    mQueue = Volley.newRequestQueue(this);
    pQueue = Volley.newRequestQueue(this);
    listItem = new ArrayList<>();
    placeid = new ArrayList<>();
    police = findViewById(R.id.textView11);
    userlist = findViewById(R.id.users_list);
    jsonParse();
    userlist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String phone = jsonParseNumber(position);
            }
        });
    }

jsonParse (локально получает имена компаний такси)

        private void jsonParse() {
        String url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=51.6232817,0.2919483&radius=1000&type=taxi%20service&keyword=taxi&key=APIKEY";
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                JSONArray jsonArray = response.getJSONArray("results");
                for (int i = 0; i < jsonArray.length(); i++){
                    JSONObject result = jsonArray.getJSONObject(i);
                    String name = result.getString("name");
                    String id = result.getString("place_id");
                    placeid.add(id);
                    listItem.add(name);
                }
                adapter = new ArrayAdapter(Taxi.this, R.layout.row, listItem);
                userlist.setAdapter(adapter);
            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });

    mQueue.add(request);
}

jsonParseNumber (получает номер и вызывает его - это код, который возвращает NULL, когда он запускается в первый раз)

private String jsonParseNumber(int pos) {
    String id = placeid.get(pos);
    String url = "https://maps.googleapis.com/maps/api/place/details/json?placeid="+id+"&key=APIKEY";
    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            try {
                JSONObject jsonArray = response.getJSONObject("result");
                for (int i = 0; i < jsonArray.length(); i++){
                    number = jsonArray.getString("formatted_phone_number");
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });

    pQueue.add(request);
    Intent intent = new Intent(Intent.ACTION_DIAL);
    intent.setData(Uri.parse("tel: " + number));
    startActivity(intent);
    return number;

}

Сначала я подумал, что это может быть вызвано тем, что Dial Action вызывается до завершения Parser, поэтому я переместил его в конец jsonParseNumber, чтобы убедиться, что он все еще работает то же самое.

Быстрые заметки:

2 JSON Парсеры в действии

1-й парсер получает JSON из API поиска Google PLACES для получения имен и идентификатора места такси компании в области

2-ой парсер использует идентификатор места, чтобы получить JSON из ДЕТАЛЕЙ GOOGLE PLACES для получения номера телефона

При запуске 2-го парсера он вернет NULL на первый забег однако при повторном вызове он вернет номер телефона и наберет его.

1 Ответ

0 голосов
/ 22 апреля 2020

Это потому, что ваш номер равен нулю, когда вы возвращаете «номер». Вы не ждете, пока вызов API завершится. Лучше реализовать обратный вызов, когда вы получите ответ для выполнения указанного c действия.

...