为什么在我的按钮上创建一个循环使我的Android应用程序挂起?

时间:2015-05-06 03:37:26

标签: android loops button dictionary

我正在编写基于Android位置的应用。对于我的应用程序,我需要存储每个固定时间段的当前位置。我创建了一个按钮来开始使用循环存储这些位置,但是在设备中它会在启动时挂起。如果我删除循环,它的工作原理。问题是什么?

public class MainActivity extends FragmentActivity implements LocationListener {

    GoogleMap googleMap;

    Button btnStart,btnStop, btnstatus;
    double fLat,fLon,sLat,sLon;

    ArrayList<LatLng> locArray=new ArrayList<LatLng>();    

    int var,i;

    double lat=0, lon=0;
    LatLng fLL,sLL;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnStart=(Button) findViewById(R.id.btnStart);
        btnStop=(Button) findViewById(R.id.btnStop);
        btnstatus=(Button) findViewById(R.id.btnStatus);


        btnStart.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                for(i=1;;i++)
                {
                    Location loc=googleMap.getMyLocation();

                    double lat=loc.getLatitude();
                    double lon=loc.getLongitude();

                    LatLng latLon=new LatLng(lat, lon);
                    locArray.add(latLon);
                }

            }


        });

        btnStop.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

           for(i=1;i<locArray.size();i++)
                {
                    LatLng src=locArray.get(i-1);
                    LatLng dest=locArray.get(i);

                    googleMap.addPolyline(new PolylineOptions().add(new LatLng(src.latitude, src.longitude),new LatLng(dest.latitude, dest.longitude)).width(3).color(Color.RED).geodesic(true));
                }
            }
        });


        SupportMapFragment supportMapFragment=(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        googleMap=supportMapFragment.getMap();

        //googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        // googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
        // googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
        // googleMap.setMapType(GoogleMap.MAP_TYPE_NONE);


        googleMap.setMyLocationEnabled(true);
    }


    @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 onLocationChanged(Location location) {


        Location loc=googleMap.getMyLocation();

        double latitude=loc.getLatitude();
        double longitude=loc.getLongitude();



        LatLng latLon=new LatLng(latitude, longitude);

        googleMap.addMarker(new MarkerOptions().position(latLon));
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLon));
        googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));


    }

    @Override
    public void onProviderDisabled(String arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
        // TODO Auto-generated method stub

    }


}

这是我的Button XML:

4 个答案:

答案 0 :(得分:1)

btnStart中有一个无限循环:

for (i = 1;; i++)

为什么你有一个循环?无论如何只有一个位置。只需删除for循环并保留内部代码即可。

public void onClick(View v) {
    Location loc = googleMap.getMyLocation();

    double lat = loc.getLatitude();
    double lon = loc.getLongitude();

    LatLng latLon = new LatLng(lat, lon);
    locArray.add(latLon);
}

答案 1 :(得分:0)

你的无限循环块UI线程将导致ANR:

for(i=1;;i++)

答案 2 :(得分:0)

您还没有设置退出循环的条件。

for (initialize to start loop; condition to stop loop; increment/decrement) {
    // body of loop
}

for循环是

hashmap = Hash.new{|h, k| h[k] = 0}

只是因为你没有把条件放在什么时候停下来, 这就是你收到错误的原因。

答案 3 :(得分:0)

您可以使用单个boolean变量来决定从哪里开始从哪里停止从提供商处获取位置

这是示例,变量是isStartedFetching

    private boolean isStartedFetching = false;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnStart=(Button) findViewById(R.id.btnStart);
        btnStop=(Button) findViewById(R.id.btnStop);
        btnstatus=(Button) findViewById(R.id.btnStatus);


        btnStart.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                isStartedFetching = true;
                /* for(i=1;;i++)  // this is infinite loop, so application will hang
                {
                    Location loc=googleMap.getMyLocation();

                    double lat=loc.getLatitude();
                    double lon=loc.getLongitude();

                    LatLng latLon=new LatLng(lat, lon);
                    locArray.add(latLon);
                }

            } */


        });

        btnStop.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

            isStartedFetching = false;
           for(i=1;i<locArray.size();i++)
                {
                    LatLng src=locArray.get(i-1);
                    LatLng dest=locArray.get(i);

                    googleMap.addPolyline(new PolylineOptions().add(new LatLng(src.latitude, src.longitude),new LatLng(dest.latitude, dest.longitude)).width(3).color(Color.RED).geodesic(true));
                }
            }
        });


        SupportMapFragment supportMapFragment=(SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        googleMap=supportMapFragment.getMap();

        //googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
        // googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
        // googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
        // googleMap.setMapType(GoogleMap.MAP_TYPE_NONE);


        googleMap.setMyLocationEnabled(true);
    }


    @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 onLocationChanged(Location location) {

        if(isStartedFetching) {
        Location loc=googleMap.getMyLocation();

        double latitude=loc.getLatitude();
        double longitude=loc.getLongitude();



        LatLng latLon=new LatLng(latitude, longitude);

        googleMap.addMarker(new MarkerOptions().position(latLon));
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLon));
        googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));
        }

    }