Android领域谷歌地图内存泄漏
我的主类应用程序使用改型检索数据,并写入POJO普通领域对象。然后运行第二个活动(MapsActivity),在其中设置映射,过滤领域对象的内容以获取相关数据。一切正常。 我要补充的是,Realm对象包含6600多行,所以它很大。不幸的是,我觉得我的记忆泄露了。每次启动MapsActivity(返回MainActivity,选择另一个类别并将其传递给MapsActivity)时,堆看起来都很糟糕。这显示在所附的图像中。我要补充的是,当我根本不使用领域对象时,应用程序工作得更好,我只在MapsActivity类中执行第二次改装调用。不幸的是,这个解决方案将我的工作翻了一番(在Main和Maps中,我做的事情完全相同),我希望避免这种情况。也许有人会看到我哪里有漏洞,为什么程序会慢下来。 我的主要意见是: 包com.flex.sklepikAndroid领域谷歌地图内存泄漏,android,performance,google-maps,memory-leaks,realm,Android,Performance,Google Maps,Memory Leaks,Realm,我的主类应用程序使用改型检索数据,并写入POJO普通领域对象。然后运行第二个活动(MapsActivity),在其中设置映射,过滤领域对象的内容以获取相关数据。一切正常。 我要补充的是,Realm对象包含6600多行,所以它很大。不幸的是,我觉得我的记忆泄露了。每次启动MapsActivity(返回MainActivity,选择另一个类别并将其传递给MapsActivity)时,堆看起来都很糟糕。这显示在所附的图像中。我要补充的是,当我根本不使用领域对象时,应用程序工作得更好,我只在MapsAc
public class MainActivity extends AppCompatActivity {
List<String> shopsNames;
ArrayList<RowModel> rowModels;
public static final int REQUEST_GOOGLE_PLAY_SERVICES = 1972;
public Realm mRealm;
@BindView(R.id.toolbar_layout)
CollapsingToolbarLayout toolbarLayout;
@BindView(R.id.app_bar)
AppBarLayout appBar;
private ShopsAdapter adapter;
@BindView(R.id.recycler_view)
RecyclerView recyclerView;
private ProgressDialog progressDialog;
private Dialog errorDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
ButterKnife.bind(this);
startRegistrationService();
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ConnectionDetector connectionDetector = new ConnectionDetector(this);
if (!connectionDetector.isConnection()) {
finish();
}
ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 123);
checkPlayServices();
rowModels = new ArrayList<>();
shopsNames = new ArrayList<>();
Realm.init(this);
mRealm = Realm.getDefaultInstance();
initCollapsingToolbar();
Glide.with(getApplicationContext()).load(R.drawable.shoplogo).
into((ImageView) findViewById(R.id.backdrop));
adapter = new ShopsAdapter(MainActivity.this, shopsNames);
RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(), 2);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(adapter);
AsyncTaskRetro asyncTaskRetro = new AsyncTaskRetro();
asyncTaskRetro.execute();
}
private boolean checkPlayServices() {
GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance();
int resultCode = googleApiAvailability.isGooglePlayServicesAvailable(this);
if (resultCode != ConnectionResult.SUCCESS) {
if (googleApiAvailability.isUserResolvableError(resultCode)) {
if (errorDialog == null) {
errorDialog = googleApiAvailability.getErrorDialog(this, resultCode, 2404);
errorDialog.setCancelable(false);
}
if (!errorDialog.isShowing())
errorDialog.show();
}
}
return resultCode == ConnectionResult.SUCCESS;
}
private class AsyncTaskRetro extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setMessage("Czekaj...");
progressDialog.show();
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
progressDialog.hide();
}
@Override
protected Void doInBackground(Void... voids) {
PlacesAPI.Factory.getInstance().getPlaces().enqueue(new Callback<Places>() {
@Override
public void onResponse(Call<Places> call, Response<Places> response) {
for (int i = 0; i < response.body().getPosts().size(); i++) {
RowModel rowModel = new RowModel(response.body().getPosts().get(i).getNazwa(),
Double.parseDouble(response.body().getPosts().get(i).getSzer()),
Double.parseDouble(response.body().getPosts().get(i).getDlug()));
rowModels.add(rowModel);
}
String oldName;
oldName = rowModels.get(0).getName();
shopsNames.add(rowModels.get(0).getName());
mRealm.beginTransaction();
mRealm.copyToRealm(rowModels);
mRealm.commitTransaction();
for (int j = 0; j < rowModels.size(); j++) {
if (rowModels.get(j).getName().equals(oldName)) {
continue;
}
oldName = rowModels.get(j).getName();
shopsNames.add(rowModels.get(j).getName());
}
//sortowanie listy z nazwami sklepow
Collections.sort(shopsNames);
recyclerView.setAdapter(adapter);
}
@Override
public void onFailure(Call<Places> call, Throwable t) {
}
});
return null;
}
}
@Override
protected void onResume() {
recyclerView.setAdapter(adapter);
super.onResume();
}
private void initCollapsingToolbar() {
final CollapsingToolbarLayout collapsingToolbar =
(CollapsingToolbarLayout) findViewById(R.id.toolbar_layout);
collapsingToolbar.setTitle(" ");
AppBarLayout appBarLayout = (AppBarLayout) findViewById(R.id.app_bar);
appBarLayout.setExpanded(true);
// hiding & showing the title when toolbar expanded & collapsed
appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
boolean isShow = false;
int scrollRange = -1;
@Override
public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
if (scrollRange == -1) {
scrollRange = appBarLayout.getTotalScrollRange();
}
if (scrollRange + verticalOffset == 0) {
collapsingToolbar.setTitle(getString(R.string.app_name));
isShow = true;
} else if (isShow) {
collapsingToolbar.setTitle(" ");
isShow = false;
}
}
});
}
private void startRegistrationService() {
GoogleApiAvailability api = GoogleApiAvailability.getInstance();
int code = api.isGooglePlayServicesAvailable(this);
if (code == ConnectionResult.SUCCESS) {
onActivityResult(REQUEST_GOOGLE_PLAY_SERVICES, Activity.RESULT_OK, null);
} else if (api.isUserResolvableError(code) &&
api.showErrorDialogFragment(this, code, REQUEST_GOOGLE_PLAY_SERVICES)) {
// wait for onActivityResult call (see below)
} else {
Toast.makeText(this, api.getErrorString(code), Toast.LENGTH_LONG).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_GOOGLE_PLAY_SERVICES:
if (resultCode == Activity.RESULT_OK) {
}
break;
default:
super.onActivityResult(requestCode, resultCode, data);
}
}
}
在哪个代码段的主线程上没有关闭域,因此导致内存过度泄漏?在哪个代码段的主线程上没有关闭域,因此导致内存过度泄漏?
private GoogleMap mMap;
private double naviLat, naviLong;
private double latitude, longitude;
private GoogleApiClient mGoogleApiClient;
@BindView(R.id.adView)
AdView adView;
@BindView(R.id.butnavi)
ImageButton butnavi;
private Location location;
private RealmResults<RowModel> rowModels;
private String shopName;
private Bundle bundle;
private Realm realm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map2);
ButterKnife.bind(this);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(map);
mapFragment.getMapAsync(this);
bundle = getIntent().getExtras();
shopName = bundle.getString("shopName");
mapFragment.getMapAsync(this);
ActivityCompat.requestPermissions(MapActivity.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 123);
AdRequest adRequest = new AdRequest.Builder().build();
adView.loadAd(adRequest);
realm = Realm.getDefaultInstance();
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.setOnMarkerClickListener(this);
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "Uprawnienia nie przyznane", Toast.LENGTH_SHORT).show();
}
mMap.setMyLocationEnabled(true);
cameraMove();
//po wczytaniu mapy wyciągnij dane z bazy sklepów
realmDatabaseBuild();
}
private void addMarker(double lat, double lon) {
mMap.addMarker(new MarkerOptions().position(new LatLng(lat, lon)));
}
@OnClick(R.id.butnavi)
public void btnNavi() {
if (naviLat + naviLong == 0)
Toast.makeText(this,
"Najpierw wybierz market", Toast.LENGTH_SHORT)
.show();
else {
Intent i = new Intent(Intent.ACTION_VIEW, Uri
.parse("google.navigation:q=" + naviLat + ","
+ naviLong));
startActivity(i);
finish();
System.exit(0);
}
}
private void moveCameraToActualPosition(double lat, double lon) {
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(new LatLng(lat, lon))
.zoom(12).build();
mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}
private void realmDatabaseBuild() {
rowModels = realm.where(RowModel.class).equalTo("name", shopName).findAll();
if (!rowModels.isEmpty()) {
for (int i = 0; i < rowModels.size(); i++) {
addMarker(rowModels.get(i).getLongitude(), rowModels.get(i).getLattitude());
}
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.mapTypeNormal:
mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
break;
case R.id.mapTypeSatellite:
mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
break;
case R.id.mapTypeTerrain:
mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
break;
case R.id.mapTypeHybrid:
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onBackPressed() {
super.onBackPressed();
mMap.clear();
rowModels = null;
}
@Override
protected void onResume() {
super.onResume();
}
@Override
public boolean onMarkerClick(Marker marker) {
LatLng gps = marker.getPosition();
//ustawienie lat i long dla nawigacji
naviLat = gps.latitude;
naviLong = gps.longitude;
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses;
try {
addresses = geocoder.getFromLocation(gps.latitude, gps.longitude, 1);
String adres = addresses.get(0).getAddressLine(0);
Toast.makeText(this, "Adres: " + adres, Toast.LENGTH_SHORT).show();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
public void cameraMove() {
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
String provider = locationManager.getBestProvider(criteria, true);
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "Uprawnienia nie przyznane", Toast.LENGTH_SHORT).show();
}
Location myLocation = locationManager.getLastKnownLocation(provider);
if (myLocation != null) {
LatLng ll = new LatLng(myLocation.getLatitude(), myLocation.getLongitude());
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(ll)
.zoom(11).build();
mMap.animateCamera(CameraUpdateFactory
.newCameraPosition(cameraPosition));
} else {
LatLng ll = new LatLng(52.230625, 21.013129);//WAWA
CameraPosition cp = new CameraPosition.Builder()
.target(ll)
.zoom(10).build();
mMap.animateCamera(CameraUpdateFactory
.newCameraPosition(cp));
}
}
public class RowModel extends RealmObject {
@Required
private String name;
@Required
private Double lattitude, longitude;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getLattitude() {
return lattitude;
}
public void setLattitude(Double lattitude) {
this.lattitude = lattitude;
}
public Double getLongitude() {
return longitude;
}
public void setLongitude(Double longitude) {
this.longitude = longitude;
}
public RowModel(String name, Double lattitude, Double longitude) {
this.name = name;
this.lattitude = lattitude;
this.longitude = longitude;
}
public RowModel() {
}
}