Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android领域谷歌地图内存泄漏_Android_Performance_Google Maps_Memory Leaks_Realm - Fatal编程技术网

Android领域谷歌地图内存泄漏

Android领域谷歌地图内存泄漏,android,performance,google-maps,memory-leaks,realm,Android,Performance,Google Maps,Memory Leaks,Realm,我的主类应用程序使用改型检索数据,并写入POJO普通领域对象。然后运行第二个活动(MapsActivity),在其中设置映射,过滤领域对象的内容以获取相关数据。一切正常。 我要补充的是,Realm对象包含6600多行,所以它很大。不幸的是,我觉得我的记忆泄露了。每次启动MapsActivity(返回MainActivity,选择另一个类别并将其传递给MapsActivity)时,堆看起来都很糟糕。这显示在所附的图像中。我要补充的是,当我根本不使用领域对象时,应用程序工作得更好,我只在MapsAc

我的主类应用程序使用改型检索数据,并写入POJO普通领域对象。然后运行第二个活动(MapsActivity),在其中设置映射,过滤领域对象的内容以获取相关数据。一切正常。 我要补充的是,Realm对象包含6600多行,所以它很大。不幸的是,我觉得我的记忆泄露了。每次启动MapsActivity(返回MainActivity,选择另一个类别并将其传递给MapsActivity)时,堆看起来都很糟糕。这显示在所附的图像中。我要补充的是,当我根本不使用领域对象时,应用程序工作得更好,我只在MapsActivity类中执行第二次改装调用。不幸的是,这个解决方案将我的工作翻了一番(在Main和Maps中,我做的事情完全相同),我希望避免这种情况。也许有人会看到我哪里有漏洞,为什么程序会慢下来。 我的主要意见是: 包com.flex.sklepik

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() {
    }
}