我正在编写基于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:
答案 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));
}
}