Android Studio当前位置附近地点显示异常问题排查
我在Android Studio中实现显示当前位置附近餐厅的功能,首次运行点击按钮时能正常显示结果,但退出APP后再次进入,点击按钮却没有内容展示。已尝试清理项目等方法,无效。以下是主类中的findRestaurants方法及getNearbyPlaces异步任务代码,请帮忙排查是否存在代码问题?
相关代码
public void findRestaurants(View v){ StringBuilder stringBuilder = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?"); stringBuilder.append("location="+latLngCurrent.latitude + "," +latLngCurrent.longitude); stringBuilder.append("&radius="+5000); stringBuilder.append("&keyword="+"restaurant"); stringBuilder.append("&key="+getResources().getString(R.string.google_map_keyy)); String url = stringBuilder.toString(); Object dataTransfer[] = new Object[2]; dataTransfer[0] = mMap; dataTransfer[1] = url; getNearbyPlaces getnearbyPlaces = new getNearbyPlaces(); getnearbyPlaces.execute(dataTransfer); } public class getNearbyPlaces extends AsyncTask<Object,String,String> { GoogleMap mMap; String url; InputStream is; BufferedReader bufferedReader; StringBuilder stringBuilder; String data; @Override protected String doInBackground(Object... objects) { mMap = (GoogleMap)objects[0]; url = (String)objects[1]; try { URL myurl = new URL(url); HttpURLConnection httpURLConnection = (HttpURLConnection) myurl.openConnection(); httpURLConnection.connect(); is = httpURLConnection.getInputStream(); bufferedReader = new BufferedReader(new InputStreamReader(is)); String line = ""; stringBuilder = new StringBuilder(); while((line = bufferedReader.readLine() ) != null){ stringBuilder.append(line); } data = stringBuilder.toString(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return data; } @Override protected void onPostExecute(String s) { try { JSONObject parentObject = new JSONObject(s); JSONArray resultsArray = parentObject.getJSONArray("results"); for (int i = 0; i<resultsArray.length(); i++){ JSONObject jsonObject = resultsArray.getJSONObject(i); JSONObject locationObj = jsonObject.getJSONObject("geometry").getJSONObject("location"); String latitude = locationObj.getString("lat"); String longitude = locationObj.getString("lng"); JSONObject nameObject = resultsArray.getJSONObject(i); String name_restaurant = nameObject.getString("name"); String vicinity = nameObject.getString("vicinity"); LatLng latLng = new LatLng(Double.parseDouble(latitude),Double.parseDouble(longitude)); MarkerOptions markeroptions = new MarkerOptions(); markeroptions.title(vicinity); markeroptions.position(latLng); mMap.addMarker(markeroptions); } } catch (JSONException e) { e.printStackTrace(); } } }
可能的问题及修复建议
位置变量
latLngCurrent未重新初始化
退出APP后重启,latLngCurrent可能未重新获取有效位置(比如位置权限未重新授权、位置更新逻辑未触发),导致请求URL中的location参数无效,Places API返回空结果。
修复:调用findRestaurants前先检查latLngCurrent是否非空且有效,若无效则重新触发位置获取流程(比如请求位置权限、调用FusedLocationProviderClient获取最新位置)。GoogleMap实例失效
重启后MapFragment可能已重新创建,但全局mMap引用仍指向旧实例,异步任务中调用mMap.addMarker无法在新地图上显示标记。
修复:确保每次调用findRestaurants时,mMap是通过onMapReady回调获取的最新有效实例,或者在方法内从MapFragment重新获取mMap。网络请求异常未处理
异步任务捕获异常仅打印堆栈,未返回错误标识,若重启后网络异常、API密钥配额耗尽等,onPostExecute解析空字符串会抛出异常但无提示,导致无内容展示。
修复:在doInBackground中处理异常时返回错误信息,onPostExecute先判断s是否为空或无效,再进行解析,同时添加Toast提示用户请求失败。标记堆积(次要)
每次点击按钮都会新增标记,未清空旧标记,虽不导致重启后无内容,但会造成地图标记混乱,建议添加标记前调用mMap.clear()。
内容的提问来源于stack exchange,提问作者UserRW

