这里有点奇怪的问题。目前,我正在进行一项活动,该活动使用Google Places Search API获取所有出租车公司的名称和地点ID,并将其放入列表视图。然后,当单击该项目时,它将获得地点ID,并运行Places Details API来获取电话号码。
[目前,我遇到的问题是,第一次在列表视图中单击该项目时,JSON解析器将返回NULL,并且电话将拨打6855或685-5之类的号码。如果您返回并单击相同或另一个项目,则电话号码将正确提取。
在活动中,我正在运行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,所以我将其移到jsonParseNumber的末尾以确保但仍会执行相同的操作。
快速注释:
2个活动中的JSON解析器
第一解析器从GOOGLE PLACES SEARCH API获取JSON,以获取该地区出租车公司的名称和位置ID
第二解析器使用地点ID从GOOGLE PLACES DETAILS获取JSON以获取电话号码
[运行第二个解析器时,它将在第一次运行时返回NULL,但是如果再次调用,它将返回返回的预期电话号码并拨打它。
这是因为,当您返回“数字”时,您的数字为空。您无需等到api调用完成。最好在获得响应以执行特定操作时实现回调。