- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序可以放下标记并保存它。我还使用 mylocationoverlay 来显示用户当前位置。该应用程序大部分时间都可以运行,并且在测试期间似乎运行良好。但是,当我在手机上使用它时,如果我尝试同时使用太多的引脚(超过 500 个),它就会崩溃。我想知道我们允许拥有的叠加层数量是否有限制,或者我的程序是否还有其他问题
这是我的 Map 类,我在重新加载函数中添加了引脚(它是从网络服务器收集的)并且 mylocationoverlay 在 oncreate 方法中。
PS,我注意到每次它调用函数重新加载时,之前的覆盖都不会消失。我应该在再次添加引脚之前调用 removeAllViews 吗?谢谢
public class Maps extends MapActivity {
private MapView mapView = null;
private MyLocationOverlay myLocationOverlay = null;
ProgressDialog progressDialog;
private ArrayList<Pins> mList;
final public static int[] pincolorstar = { R.drawable.pinredstar,
R.drawable.pinlitebluestar, R.drawable.pinblackstar,
R.drawable.pindarkbluestar, R.drawable.pingreenstar,
R.drawable.pinlitegreenstar, R.drawable.pinorangestar,
R.drawable.pinyellowstar, R.drawable.pinwhitestar,
R.drawable.pinpurplestar };
static boolean setSatellite, setHybrid = false;
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
myLocationOverlay.disableMyLocation();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
myLocationOverlay.enableMyLocation();
}
@Override
protected void onCreate(Bundle icicle) {
// TODO Auto-generated method stub
super.onCreate(icicle);
try {
setContentView(R.layout.maps);
} catch (Exception e) {
e.printStackTrace();
}
final SharedPreferences prefs = getSharedPreferences("Settings", 0);
final int hour = prefs.getInt("Hour_Range", 4);
mapView = (MapView) findViewById(R.id.mapView);
myLocationOverlay = new MyLocationOverlay(Maps.this, mapView);
mapView.getOverlays().add(myLocationOverlay);
new Reload().execute();
Button done = (Button) findViewById(R.id.btnDone);
done.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
Button change = (Button) findViewById(R.id.btnChangeTime);
change.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
final int hour = prefs.getInt("Hour_Range", 4);
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.your_dialog,
(ViewGroup) findViewById(R.id.relativeLayoutMaps));
final SeekBar seekBar = (SeekBar) layout
.findViewById(R.id.seekBarChangeTime);
final TextView ChangeTexthour = (TextView) layout
.findViewById(R.id.tVChangeableTime);
ChangeTexthour.setText(prefs.getString("Hour_notification",
"Only most recent positions"));
seekBar.setProgress(hour);
OnSeekBarChangeListener yourSeekBarListener = new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar,
int progress, boolean fromUser) {
ChangeTexthour
.setText(getResources()
.getString(
R.string.showlocationsforthelastxhours1)
+ " "
+ progress
+ " "
+ getResources()
.getString(
R.string.showlocationsforthelastxhours2));
}
};
seekBar.setOnSeekBarChangeListener(yourSeekBarListener);
AlertDialog.Builder builder = new AlertDialog.Builder(Maps.this)
.setView(layout)
.setPositiveButton(
getResources().getString(R.string.Cancel), null)
.setNegativeButton("Set",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
SharedPreferences.Editor editor = prefs
.edit();
editor.putString(
"Hour_notification",
getResources()
.getString(
R.string.showlocationsforthelastxhours1)
+ " "
+ seekBar.getProgress()
+ " "
+ getResources()
.getString(
R.string.showlocationsforthelastxhours2));
editor.putInt("Hour_Range",
seekBar.getProgress());
editor.commit();
new Reload().execute();
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
});
Button displayChange = (Button) findViewById(R.id.btnDisplayChange);
displayChange.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(Maps.this)
.setMessage("Map Display Mode")
.setPositiveButton("Map",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
setSatellite = false;
setHybrid = false;
new Reload().execute();
}
})
.setNeutralButton("Satellite",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
setSatellite = true;
setHybrid = false;
new Reload().execute();
}
})
.setNegativeButton("Hybrid",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
setHybrid = true;
setSatellite = false;
new Reload().execute();
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
});
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
private class Pins {
private String name;
private String time;
private String id;
private boolean mostrecent;
private Double longitude;
private Double latitude;
public Pins(String time, String id, String mostrecent,
Double longitude, Double latitude) {
this.time = time;
this.id = id;
this.longitude = longitude;
this.latitude = latitude;
boolean active = false;
if (mostrecent.equals("1"))
active = true;
else
active = false;
this.mostrecent = active;
}
public String getName() {
return name;
}
public String getTime() {
return time;
}
public String getId() {
return id;
}
public boolean getMostRecent() {
return mostrecent;
}
public Double getLongitude() {
return longitude;
}
public Double getLatitude() {
return latitude;
}
public void setName(String name) {
this.name = name;
}
}
public class Reload extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
final SharedPreferences prefs = getSharedPreferences("Settings", 0);
final int hour = prefs.getInt("Hour_Range", 4);
int followsize = 0;
for (int i = 0; i < ImTracking.ping.length; i++) {
followsize += ImTracking.ping[i];
}
String[] ids = new String[followsize];
int counter = 0;
for (int i = 0; i < ImTracking.ping.length; i++) {
if (ImTracking.ping[i] == 1) {
ids[counter] = ImTracking.pList.get(i).getid();
counter++;
}
}
JSONArray users = new JSONArray(Arrays.asList(ids));
HttpParams httpParams = new BasicHttpParams();
// 30seconds and it stops
HttpConnectionParams.setConnectionTimeout(httpParams, 30000);
HttpConnectionParams.setSoTimeout(httpParams, 30000);
DefaultHttpClient httpclient = new DefaultHttpClient(httpParams);
HttpPost httpost = new HttpPost(
"https://iphone-radar.com/gps/gps_locations_fetch");
JSONObject holder = new JSONObject();
try {
holder.put("userids", users);
holder.put("range", hour);
Calendar c = Calendar.getInstance();
TimeZone tz = c.getTimeZone();
Date now = new Date();
int offsetFromUtc = tz.getOffset(now.getTime()) / 1000;
holder.put("timezone", offsetFromUtc);
StringEntity se = new StringEntity(holder.toString());
httpost.setEntity(se);
httpost.setHeader("Accept", "application/json");
httpost.setHeader("Content-type", "application/json");
ResponseHandler responseHandler = new BasicResponseHandler();
String response = httpclient.execute(httpost, responseHandler);
org.json.JSONObject obj = new org.json.JSONObject(response);
JSONArray tracking_users = obj.getJSONArray("d");
ArrayList<Pins> mList = new ArrayList<Pins>();
int minLat = Integer.MAX_VALUE;
int maxLat = Integer.MIN_VALUE;
int minLon = Integer.MAX_VALUE;
int maxLon = Integer.MIN_VALUE;
for (int i = 0; i < tracking_users.length(); i++) {
JSONObject user = tracking_users.getJSONObject(i);
Pins pin = new Pins(user.getString("time"),
user.getString("user_id"),
user.getString("most_recent"),
user.getDouble("longitude"),
user.getDouble("latitude"));
maxLat = (int) Math.max(user.getDouble("latitude") * 1E6,
maxLat);
minLat = (int) Math.min(user.getDouble("latitude") * 1E6,
minLat);
maxLon = (int) Math.max(user.getDouble("longitude") * 1E6,
maxLon);
minLon = (int) Math.min(user.getDouble("longitude") * 1E6,
minLon);
mList.add(pin);
}
mapView.setSatellite(setSatellite);
mapView.setStreetView(setHybrid);
List<Overlay> mapOverlays = mapView.getOverlays();
for (int i = 0; i < mList.size(); i++) {
Drawable drawable = null;
for (int k = 0; k < ImTracking.pList.size(); k++) {
if (mList.get(i).getId()
.equals(ImTracking.pList.get(k).getid())) {
mList.get(i).setName(
ImTracking.pList.get(k).getName());
if (mList.get(i).getMostRecent()) {
drawable = Maps.this.getResources()
.getDrawable(
pincolorstar[ImTracking.pList
.get(k).getPosition()]);
} else {
drawable = Maps.this
.getResources()
.getDrawable(
ImTracking.pincolors[ImTracking.pList
.get(k).getPosition()]);
}
}
}
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(
drawable, mapView);
GeoPoint myPoint = new GeoPoint((int) (mList.get(i)
.getLatitude() * 1E6), (int) (mList.get(i)
.getLongitude() * 1E6));
OverlayItem overlayitem = new OverlayItem(myPoint, mList
.get(i).getName(), mList.get(i).getTime());
itemizedoverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedoverlay);
}
MapController mc = mapView.getController();
mc.zoomToSpan(Math.abs(maxLat - minLat),
Math.abs(maxLon - minLon));
mc.animateTo(new GeoPoint((maxLat + minLat) / 2,
(maxLon + minLon) / 2));
} catch (Exception e) {
e.printStackTrace();
}
progressDialog.dismiss();
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = ProgressDialog.show(Maps.this, "",
"Updating Data...");
}
}
}
最佳答案
你不应该有 500 个叠加层,每个叠加层只有一个图钉。你应该拥有的只是两个叠加层。一个是 MyLocationOverlay,另一个是 ItemizedOverlay。
ItemizedOverlay 可以容纳多个图钉。您应该将下面的行从循环中取出。
mapOverlays.add(itemizedoverlay);
See also OverlayItem setMarker() to set the Drawable for individual item so you don't have to create multiple overlays.
To be more precise:
// take this out from the loop since you only need one
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, mapView);
for (int i = 0; i < mList.size(); i++) {
... the rest of the code
GeoPoint myPoint = new GeoPoint((int) (mList.get(i)
.getLatitude() * 1E6), (int) (mList.get(i)
.getLongitude() * 1E6));
OverlayItem overlayitem = new OverlayItem(myPoint, mList
.get(i).getName(), mList.get(i).getTime());
// set the drawable here for each item instead of setting it for each Overlay
overlayitem.setMarker(drawable);
itemizedoverlay.addOverlay(overlayitem);
}
// take this one out the loop. ItemizedOverlay can handle multiple items
// you don't have to create multiple ItemizedOverlay for each pin
mapOverlays.add(itemizedoverlay);
关于android - 我可以在谷歌地图中拥有最大数量的叠加层吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7296619/
“用 Haskell 进行函数式思考”中的练习之一是使用融合定律使程序更加高效。我在尝试复制答案时遇到了一些麻烦。 部分计算要求您将 maximum (xs++ map (x+) xs) 转换为 ma
我正在尝试获得 R 中最大/最小的可表示数字。 输入“.Machine”后 我有: $double.xmin [1] 2.225074e-308 $double.xmax [1] 1.797693e+
有没有办法更改浏览器验证消息 请检查所附图片。 我目前正在使用 wooCommerce 目前它显示小于或等于 X 个数字,我想更改为请求超过 X 个项目的报价。 请多多指教 最佳答案 您需要使用oni
我正在尝试将解决方案从 Excel 求解器复制到 R 中,但不知道从哪里开始。 问题: 每小时选择 5 个选项(5 行),以最大化“分数”的总和,而无需在多个小时内选择同一组 2 次。 换句话说: 最
Haskell 中是否有这样的功能: max_of_type :: (Num a) => a 所以: max_of_type :: Int == 2 ^ 31 - 1 // for example,
我有这两个表示时间范围(秒)的输入字段,我需要这样设置,以便“from/min”字段不能高于“to/max”,反之亦然。 到目前为止我得到了这个: jQuery(document).ready(fun
我有一个看起来像这样的表: http://sqlfiddle.com/#!9/152d2/1/0 CREATE TABLE Table1 ( id int, value decimal(10,
我会尝试尽可能简单地解释它: 首先是一些带有虚拟数据的数据库结构。 结构 tb_spec_fk feature value ----------------- 1 1 1
我有两个表。 表 1: +---------+---------+ | Lead_ID | Deal_ID | +---------+---------+ | 2323 | null |
我的数据库中有一个字段可以包含数字,例如8.00 或范围编号,例如8.00 - 10.00。 如果您将每个数字作为单独的数字,我需要从表中获取 MIN() 和 MAX()。例如当范围为 8.00 -
max(float('nan'), 1) 计算结果为 nan max(1, float('nan')) 计算结果为 1 这是预期的行为吗? 感谢您的回答。 max 在 iterable 为空时引发异常
我想问一下如何在 CSS 中创建一个页脚栏,它具有最小宽度(比如 650 像素),并且会根据窗口大小进行拉伸(stretch),但仅限于某个点(比如 1024 像素)。 我的意思是当窗口大小为例如 1
我尝试调整表格列宽(下一个链接上的“作者”列 http://deploy.jtalks.org/jcommune/branches/1?lang=en)。我已将最小/最大属性添加到 .author-c
在 C# 中,是否有用于将最小值和最大值存储为 double 值的内置类? 此处列出的要点 http://msdn.microsoft.com/en-us/library/system.windows
问题: 每个任务队列是否可以每秒处理超过 500 个任务? 每个 GAE 应用是否可以每秒处理超过 50,000 个任务? 详细信息: Task queue quota文档说: Push Queue
我想知道是否允许最大或最小堆树具有重复值?我试图仅通过在线资源查找与此相关的信息,但一直没有成功。 最佳答案 是的,他们可以。您可以在“算法简介”(Charles E. Leiserson、Cliff
首先,我是 .NET 开发人员,喜欢 C# 中的 LINQ 和扩展方法。 但是当我编写脚本时,我需要相当于 Enumerable extension methods 的东西 任何人都可以给我任何建议/
这是一个检查最大 malloc 大小的简单程序: #include std::size_t maxDataSize = 2097152000; //2000mb void MallocTest(vo
我想找到我的数据的最小值和最大值。 我的数据文件: 1 2 4 5 -3 -13 112 -3 55 42 42 而我的脚本: {min=max=$1} {if ($1max) {max=$1}
我想查询我的Elastic-Search以获取仅具有正值的最低价格价格。我的价格也可以为零和-1;所以我不希望我的最小聚合返回0或-1。我知道我应该向查询(或过滤器)添加脚本,但是我不知道如何。我当前
我是一名优秀的程序员,十分优秀!