功能:主活动中有一个百度MapView控件,在这个控件里显示现在的位置。
出现的BUG:MapView有 一定概率 不显示当前位置,而是显示默认的地图位置(天安门)一番鼓捣之后有如下发现:
当BDLocationListener继承类的方法
onReceiverLocation(DBLocation bdLocation) {
runOnUiThread(new Runnable {
public void run(){
//逻辑
}
});
}
改成如下实现方式时
onReceiverLocation(BDLocation bdLocation) {
//逻辑
}
这个BUG只出现了一次,我反复测试了几十次main_layout中只有一个<com.baicu.map.MapView/>控件,代码略
下面是MainActivity.java中的代码:package com.example.seele.gxxlbs;import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity { private BaiduMap baiduMap; private boolean isFirstLocate = true; private static final String TAG = "MainActivity";
public LocationClient mLocationClient; public TextView positionText; private MapView mapView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener());
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
mapView = (MapView) findViewById(R.id.bmapView);
baiduMap = mapView.getMap();
baiduMap.setMyLocationEnabled(true);
positionText = (TextView) findViewById(R.id.position_text_view);
List<String> permissionList = new ArrayList<>(); if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!permissionList.isEmpty()) {
String [] permissions = permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
} else {
Log.d(TAG, "onCreate: beforeRequestLocation");
requestLocation();
Log.d(TAG, "onCreate: afterRequestLocation");
}
} private void navigateTo(BDLocation location) {
if (isFirstLocate) {
LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
Log.d(TAG, "navigateTo: 1");
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
Log.d(TAG, "navigateTo: 2");
baiduMap.animateMapStatus(update);
Log.d(TAG, "navigateTo: 3");
update = MapStatusUpdateFactory.zoomTo(16f);
Log.d(TAG, "navigateTo: 4");
baiduMap.animateMapStatus(update);
Log.d(TAG, "navigateTo: 5");
isFirstLocate = false;
Log.d(TAG, "navigateTo: isFirstLocate");
}
MyLocationData.Builder locationBuilder = new MyLocationData.Builder();
Log.d(TAG, "navigateTo: 6");
locationBuilder.latitude(location.getLatitude());
Log.d(TAG, "navigateTo: 7");
locationBuilder.longitude(location.getLongitude());
Log.d(TAG, "navigateTo: 8");
MyLocationData locationData = locationBuilder.build();
Log.d(TAG, "navigateTo: 9");
baiduMap.setMyLocationData(locationData);
Log.d(TAG, "navigateTo: navigateTo");
} @Override
protected void onResume() {
super.onResume();
mapView.onResume();
} @Override
protected void onPause() {
super.onPause();
mapView.onPause();
} private void initLocation() {
LocationClientOption option = new LocationClientOption();
option.setScanSpan(5000);
option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);
mLocationClient.setLocOption(option);
} @Override
protected void onDestroy() {
super.onDestroy();
mLocationClient.stop();
mapView.onDestroy();
baiduMap.setMyLocationEnabled(false);
} @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0) {
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "必须同意所有授权才能使用本程序", Toast.LENGTH_SHORT).show();
finish();
return;
}
}
requestLocation();
} else {
Toast.makeText(this, "发生未知错误", Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
break;
}
} public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(final BDLocation bdLocation) {
Log.d(TAG, "onReceiveLocation: beforeUnOnUiThread");
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "run: beforeIf");
if (bdLocation.getLocType() == BDLocation.TypeNetWorkLocation
|| bdLocation.getLocType() == BDLocation.TypeGpsLocation) {
Log.d(TAG, "run: beforeNavigateTo");
navigateTo(bdLocation);
Log.d(TAG, "run: afterNavigateTo");
}
}
});
} @Override
public void onConnectHotSpotMessage(String s, int i) {
//
}
}
private void requestLocation() {
initLocation();
Log.d(TAG, "requestLocation: beforeStart");
mLocationClient.start();
Log.d(TAG, "requestLocation: afterStart");
}}
调试结果:
07-25 02:23:04.500 18033-18033/com.example.seele.gxxlbs D/MainActivity: onCreate: beforeRequestLocation
07-25 02:23:04.501 18033-18033/com.example.seele.gxxlbs D/MainActivity: requestLocation: beforeStart
07-25 02:23:04.501 18033-18033/com.example.seele.gxxlbs D/MainActivity: requestLocation: afterStart
07-25 02:23:04.501 18033-18033/com.example.seele.gxxlbs D/MainActivity: onCreate: afterRequestLocation
07-25 02:23:04.528 18033-18033/com.example.seele.gxxlbs D/ActivityThread: ACT-AM_ON_RESUME_CALLED ActivityRecord{15af989 token=android.os.BinderProxy@4ba2d8e {com.example.seele.gxxlbs/com.example.seele.gxxlbs.MainActivity}}
07-25 02:23:04.544 18033-18033/com.example.seele.gxxlbs D/ViewRootImpl: hardware acceleration is enabled, this = ViewRoot{290ca9d com.example.seele.gxxlbs/com.example.seele.gxxlbs.MainActivity,ident = 0}
07-25 02:23:04.579 18033-18121/com.example.seele.gxxlbs D/OpenGLRenderer: CanvasContext() 0x7f78e20800 initialize window=0x7f61a53010, title=com.example.seele.gxxlbs/com.example.seele.gxxlbs.MainActivity
07-25 02:23:04.665 18033-18063/com.example.seele.gxxlbs D/MainActivity: onReceiveLocation: beforeUnOnUiThread
07-25 02:23:04.677 18033-18033/com.example.seele.gxxlbs D/MainActivity: run: beforeIf
07-25 02:23:04.677 18033-18033/com.example.seele.gxxlbs D/MainActivity: run: beforeNavigateTo
07-25 02:23:04.678 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: 1
07-25 02:23:04.678 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: 2
07-25 02:23:04.680 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: 3
07-25 02:23:04.680 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: 4
07-25 02:23:04.680 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: 5
07-25 02:23:04.681 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: isFirstLocate
07-25 02:23:04.681 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: 6
07-25 02:23:04.681 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: 7
07-25 02:23:04.681 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: 8
07-25 02:23:04.681 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: 9
07-25 02:23:04.682 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: navigateTo
07-25 02:23:04.682 18033-18033/com.example.seele.gxxlbs D/MainActivity: run: afterNavigateTo
出现的BUG:MapView有 一定概率 不显示当前位置,而是显示默认的地图位置(天安门)一番鼓捣之后有如下发现:
当BDLocationListener继承类的方法
onReceiverLocation(DBLocation bdLocation) {
runOnUiThread(new Runnable {
public void run(){
//逻辑
}
});
}
改成如下实现方式时
onReceiverLocation(BDLocation bdLocation) {
//逻辑
}
这个BUG只出现了一次,我反复测试了几十次main_layout中只有一个<com.baicu.map.MapView/>控件,代码略
下面是MainActivity.java中的代码:package com.example.seele.gxxlbs;import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity { private BaiduMap baiduMap; private boolean isFirstLocate = true; private static final String TAG = "MainActivity";
public LocationClient mLocationClient; public TextView positionText; private MapView mapView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener());
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
mapView = (MapView) findViewById(R.id.bmapView);
baiduMap = mapView.getMap();
baiduMap.setMyLocationEnabled(true);
positionText = (TextView) findViewById(R.id.position_text_view);
List<String> permissionList = new ArrayList<>(); if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.READ_PHONE_STATE);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
}
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (!permissionList.isEmpty()) {
String [] permissions = permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
} else {
Log.d(TAG, "onCreate: beforeRequestLocation");
requestLocation();
Log.d(TAG, "onCreate: afterRequestLocation");
}
} private void navigateTo(BDLocation location) {
if (isFirstLocate) {
LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
Log.d(TAG, "navigateTo: 1");
MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(ll);
Log.d(TAG, "navigateTo: 2");
baiduMap.animateMapStatus(update);
Log.d(TAG, "navigateTo: 3");
update = MapStatusUpdateFactory.zoomTo(16f);
Log.d(TAG, "navigateTo: 4");
baiduMap.animateMapStatus(update);
Log.d(TAG, "navigateTo: 5");
isFirstLocate = false;
Log.d(TAG, "navigateTo: isFirstLocate");
}
MyLocationData.Builder locationBuilder = new MyLocationData.Builder();
Log.d(TAG, "navigateTo: 6");
locationBuilder.latitude(location.getLatitude());
Log.d(TAG, "navigateTo: 7");
locationBuilder.longitude(location.getLongitude());
Log.d(TAG, "navigateTo: 8");
MyLocationData locationData = locationBuilder.build();
Log.d(TAG, "navigateTo: 9");
baiduMap.setMyLocationData(locationData);
Log.d(TAG, "navigateTo: navigateTo");
} @Override
protected void onResume() {
super.onResume();
mapView.onResume();
} @Override
protected void onPause() {
super.onPause();
mapView.onPause();
} private void initLocation() {
LocationClientOption option = new LocationClientOption();
option.setScanSpan(5000);
option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);
mLocationClient.setLocOption(option);
} @Override
protected void onDestroy() {
super.onDestroy();
mLocationClient.stop();
mapView.onDestroy();
baiduMap.setMyLocationEnabled(false);
} @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0) {
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "必须同意所有授权才能使用本程序", Toast.LENGTH_SHORT).show();
finish();
return;
}
}
requestLocation();
} else {
Toast.makeText(this, "发生未知错误", Toast.LENGTH_SHORT).show();
finish();
}
break;
default:
break;
}
} public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(final BDLocation bdLocation) {
Log.d(TAG, "onReceiveLocation: beforeUnOnUiThread");
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "run: beforeIf");
if (bdLocation.getLocType() == BDLocation.TypeNetWorkLocation
|| bdLocation.getLocType() == BDLocation.TypeGpsLocation) {
Log.d(TAG, "run: beforeNavigateTo");
navigateTo(bdLocation);
Log.d(TAG, "run: afterNavigateTo");
}
}
});
} @Override
public void onConnectHotSpotMessage(String s, int i) {
//
}
}
private void requestLocation() {
initLocation();
Log.d(TAG, "requestLocation: beforeStart");
mLocationClient.start();
Log.d(TAG, "requestLocation: afterStart");
}}
调试结果:
07-25 02:23:04.500 18033-18033/com.example.seele.gxxlbs D/MainActivity: onCreate: beforeRequestLocation
07-25 02:23:04.501 18033-18033/com.example.seele.gxxlbs D/MainActivity: requestLocation: beforeStart
07-25 02:23:04.501 18033-18033/com.example.seele.gxxlbs D/MainActivity: requestLocation: afterStart
07-25 02:23:04.501 18033-18033/com.example.seele.gxxlbs D/MainActivity: onCreate: afterRequestLocation
07-25 02:23:04.528 18033-18033/com.example.seele.gxxlbs D/ActivityThread: ACT-AM_ON_RESUME_CALLED ActivityRecord{15af989 token=android.os.BinderProxy@4ba2d8e {com.example.seele.gxxlbs/com.example.seele.gxxlbs.MainActivity}}
07-25 02:23:04.544 18033-18033/com.example.seele.gxxlbs D/ViewRootImpl: hardware acceleration is enabled, this = ViewRoot{290ca9d com.example.seele.gxxlbs/com.example.seele.gxxlbs.MainActivity,ident = 0}
07-25 02:23:04.579 18033-18121/com.example.seele.gxxlbs D/OpenGLRenderer: CanvasContext() 0x7f78e20800 initialize window=0x7f61a53010, title=com.example.seele.gxxlbs/com.example.seele.gxxlbs.MainActivity
07-25 02:23:04.665 18033-18063/com.example.seele.gxxlbs D/MainActivity: onReceiveLocation: beforeUnOnUiThread
07-25 02:23:04.677 18033-18033/com.example.seele.gxxlbs D/MainActivity: run: beforeIf
07-25 02:23:04.677 18033-18033/com.example.seele.gxxlbs D/MainActivity: run: beforeNavigateTo
07-25 02:23:04.678 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: 1
07-25 02:23:04.678 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: 2
07-25 02:23:04.680 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: 3
07-25 02:23:04.680 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: 4
07-25 02:23:04.680 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: 5
07-25 02:23:04.681 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: isFirstLocate
07-25 02:23:04.681 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: 6
07-25 02:23:04.681 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: 7
07-25 02:23:04.681 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: 8
07-25 02:23:04.681 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: 9
07-25 02:23:04.682 18033-18033/com.example.seele.gxxlbs D/MainActivity: navigateTo: navigateTo
07-25 02:23:04.682 18033-18033/com.example.seele.gxxlbs D/MainActivity: run: afterNavigateTo
解决方案 »
- android 的运算能力如何?
- android 操作数据库框架 解决多线程 不用写SQL,千万别错过
- 如何获取当前浏览的网页的地址?
- 【求助】关于用SkCanvas绘制SkBitmap的问题
- 如何获取Activity的高度和宽度,也就是如何判断当前为横屏还是竖屏
- 怎么可以找到程序运行产生的Log,在源代码的什么地方?
- 如何根据设备屏幕的大小自动调整界面的大小
- 使用Android NDK编译程序问题
- 请教AndroidManifest.xml中的Service的name和Action的name可以不一样?
- android spinner下拉列表右侧箭头颜色怎么设置
- 微信SDK天坑
- 阿里电面:如何保证网络传输的安全?
如果没有返回location,监听类就触发不了,
那么BDLocationListener的onReceiverLocation()方法就执行不了,
那么根本就无法执行navigateTo()方法,
但是根据Logcat的日志,很明显,navigate()方法执行了,无论出没出现上述BUG都执行。