我在Android中使用Google地图实施时出现问题。我想从互联网上获取一些数据(有些人说在地图的可见部分有单位)。当我想在onPostExecute中清除地图中的所有先前标记时,问题就开始了。这是代码:
private class GetNewPins extends AsyncTask<Void, String, Unit[]>
{
@Override
protected Unit[] doInBackground(Void... f_url)
{
try
{
LatLng campos = map.getCameraPosition().target;
VisibleRegion vr = map.getProjection().getVisibleRegion();
double left = vr.latLngBounds.southwest.longitude;
double top = vr.latLngBounds.northeast.latitude;
double right = vr.latLngBounds.northeast.longitude;
double bottom = vr.latLngBounds.southwest.latitude;
Location middleLeftCornerLocation = new Location("right");
Location center = new Location("center");
middleLeftCornerLocation.setLatitude(right);
middleLeftCornerLocation.setLongitude(vr.latLngBounds
.getCenter().longitude);
center.setLatitude(vr.latLngBounds.getCenter().latitude);
center.setLongitude(vr.latLngBounds.getCenter().longitude);
float dis = center.distanceTo(middleLeftCornerLocation);
System.out.println("Gettin' data from " + campos.latitude + " "
+ campos.longitude + " " + dis);
Unit[] units = new FreechargingAPI().GetUnitsOnMap(
campos.latitude, campos.longitude, dis);
if (units != null)
{
return units;
}
} catch (Exception e)
{
System.out.println(e);
}
return null;
}
@Override
protected void onPostExecute(final Unit[] units)
{
if (units == null)
{
return;
}
MapView.this.runOnUiThread(new Runnable()
{
@Override
public void run()
{
map.clear();
for (Unit u : units)
{
// Creating an instance of MarkerOptions to set position
MarkerOptions markerOptions = new MarkerOptions();
// Setting position on the MarkerOptions
markerOptions.position(new LatLng(Double.parseDouble(u
.getUnitgpslatitude()), Double.parseDouble(u
.getUnitgpslongitude())));
// Adding marker on the GoogleMap
Marker marker = map.addMarker(markerOptions.title(
u.getUnitname()).snippet(
DistanceConverter.convert(u.getDistance())));
// Showing InfoWindow on the GoogleMap
marker.showInfoWindow();
}
}// public void run() {
});
}
}
正如您可能看到的,我已经尝试对问题map.clear()“没有运行主线程”进行一些研究但没有成功,因为asynctask根本没有运行而我得到的只是只是这个非法的例子:不在主线上。
EDIT1:不,它甚至不能在简单的onpostexecute上工作,我仍然没有在主线程上找到东西
EDIT2:因为我完全忘记了堆栈跟踪,我意识到我在后台进程中有一个try catch块,抱歉,我在凌晨4点写了代码。所以堆栈跟踪是:
11-05 10:48:56.504: W/System.err(5498): java.lang.IllegalStateException: Not on the main thread
11-05 10:48:56.504: W/System.err(5498): at com.google.j.a.cl.b(Unknown Source)
11-05 10:48:56.504: W/System.err(5498): at com.google.maps.api.android.lib6.c.br.b(Unknown Source)
11-05 10:48:56.504: W/System.err(5498): at com.google.maps.api.android.lib6.c.dw.a(Unknown Source)
11-05 10:48:56.504: W/System.err(5498): at com.google.android.gms.maps.internal.l.onTransact(SourceFile:51)
11-05 10:48:56.505: W/System.err(5498): at android.os.Binder.transact(Binder.java:380)
11-05 10:48:56.505: W/System.err(5498): at com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.getCameraPosition(Unknown Source)
11-05 10:48:56.505: W/System.err(5498): at com.google.android.gms.maps.GoogleMap.getCameraPosition(Unknown Source)
11-05 10:48:56.505: W/System.err(5498): at com.reddatura.freecharging_beta.MapView$GetNewPins.doInBackground(MapView.java:241)
11-05 10:48:56.505: W/System.err(5498): at com.reddatura.freecharging_beta.MapView$GetNewPins.doInBackground(MapView.java:1)
11-05 10:48:56.505: W/System.err(5498): at android.os.AsyncTask$2.call(AsyncTask.java:288)
11-05 10:48:56.505: W/System.err(5498): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
11-05 10:48:56.505: W/System.err(5498): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
11-05 10:48:56.505: W/System.err(5498): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
11-05 10:48:56.505: W/System.err(5498): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
11-05 10:48:56.505: W/System.err(5498): at java.lang.Thread.run(Thread.java:818)
感谢彼得。所以这个问题似乎不像我最初想的那样在onPostExecute,但它是doinbackground,我想得到campos变量
EDIT3:正如Adogeon建议我把整个事情放在主循环中,但有一个例外,我知道,只是为了我为此使用asynctask ...但我很容易建议
11-05 11:28:06.926: W/System.err(6417): android.os.NetworkOnMainThreadException
11-05 11:28:06.927: W/System.err(6417): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
11-05 11:28:06.927: W/System.err(6417): at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:249)
11-05 11:28:06.927: W/System.err(6417): at libcore.io.IoBridge.recvfrom(IoBridge.java:553)
11-05 11:28:06.927: W/System.err(6417): at java.net.PlainSocketImpl.read(PlainSocketImpl.java:485)
11-05 11:28:06.927: W/System.err(6417): at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:37)
11-05 11:28:06.927: W/System.err(6417): at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:237)
11-05 11:28:06.927: W/System.err(6417): at com.android.okio.Okio$2.read(Okio.java:113)
11-05 11:28:06.927: W/System.err(6417): at com.android.okio.RealBufferedSource.indexOf(RealBufferedSource.java:147)
11-05 11:28:06.927: W/System.err(6417): at com.android.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:94)
11-05 11:28:06.928: W/System.err(6417): at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:175)
11-05 11:28:06.928: W/System.err(6417): at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:101)
11-05 11:28:06.928: W/System.err(6417): at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:616)
11-05 11:28:06.928: W/System.err(6417): at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:379)
11-05 11:28:06.928: W/System.err(6417): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:323)
11-05 11:28:06.928: W/System.err(6417): at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:190)
11-05 11:28:06.928: W/System.err(6417): at com.reddatura.serverside.FreechargingAPI.ExecuteGET(FreechargingAPI.java:42)
11-05 11:28:06.928: W/System.err(6417): at com.reddatura.serverside.FreechargingAPI.GetUnitsOnMap(FreechargingAPI.java:100)
11-05 11:28:06.928: W/System.err(6417): at com.reddatura.freecharging_beta.MapView$1.onMapSettled(MapView.java:101)
11-05 11:28:06.928: W/System.err(6417): at com.reddatura.listeners.MapStateListener.settleMap(MapStateListener.java:119)
11-05 11:28:06.928: W/System.err(6417): at com.reddatura.listeners.MapStateListener$4$1.run(MapStateListener.java:78)
11-05 11:28:06.928: W/System.err(6417): at android.os.Handler.handleCallback(Handler.java:739)
11-05 11:28:06.928: W/System.err(6417): at android.os.Handler.dispatchMessage(Handler.java:95)
11-05 11:28:06.928: W/System.err(6417): at android.os.Looper.loop(Looper.java:135)
11-05 11:28:06.928: W/System.err(6417): at android.app.ActivityThread.main(ActivityThread.java:5221)
11-05 11:28:06.928: W/System.err(6417): at java.lang.reflect.Method.invoke(Native Method)
11-05 11:28:06.929: W/System.err(6417): at java.lang.reflect.Method.invoke(Method.java:372)
11-05 11:28:06.929: W/System.err(6417): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
11-05 11:28:06.929: W/System.err(6417): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
编辑X:没关系伙计们,我已经把它搞得很难看了,但是现在它看起来很有效......在asynctask执行之前移动了所有“基于地图的东西”,所以我在线程之间传递东西,是非常不安全的,但它确实有效,没有其他问题。愿上帝怜悯我的灵魂,因为我将承诺犯下罪恶......
谢谢大家的帮助:))
答案 0 :(得分:1)
您应该在主线程上调用该操作。您不能操纵主线程以外的视图(例如,在doInBackground方法中)。 只需删除异步任务。
答案 1 :(得分:0)
我这样做了:
vr = map.getProjection().getVisibleRegion();
LatLng curPos = map.getCameraPosition().target;
if (prevPos.latitude != curPos.latitude
|| prevPos.longitude != curPos.longitude)
{
new GetNewPins().execute(curPos);
}
vr
是VisibleRegion,它是类中的私有字段,将由GetNewPins使用。此外,我已将参数更改为GetNewPins的LatLng,因此现在所有Google地图相关内容都在主线程上。
答案 2 :(得分:0)