Android 旅程监控-向地图添加标记时停止工作
我的定位软件还可以。现在我的目的是将应用程序更改为旅程监控。这个想法是从一个包含车辆当前纬度和经度的网站上获取信息。我将url请求添加到一个可运行文件中。我收到了java.lang.IllegalStateException:Not on the main thread,com.google.android.gms.maps.internal.igoglemappdelegate$a$a.addMarker(未知源)和com.google.android.gms.maps.GoogleMap.addMarker(未知源)。我怎样才能解决这个问题 活动:Android 旅程监控-向地图添加标记时停止工作,android,google-maps,Android,Google Maps,我的定位软件还可以。现在我的目的是将应用程序更改为旅程监控。这个想法是从一个包含车辆当前纬度和经度的网站上获取信息。我将url请求添加到一个可运行文件中。我收到了java.lang.IllegalStateException:Not on the main thread,com.google.android.gms.maps.internal.igoglemappdelegate$a$a.addMarker(未知源)和com.google.android.gms.maps.GoogleMap.a
package tri.mylocapp;
//import...
public class MainActivity extends Activity{
GoogleMap googlemap = null;
LatLng latlng;
LocationManager lm;
String provider;
Location location;
MarkerOptions marker;
double lat,lng;
URL url;
URLConnection conn;
String str;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (isGooglePlay()){
setContentView(R.layout.activity_main);
setUpMap();
}
}
private boolean isGooglePlay(){
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (status == ConnectionResult.SUCCESS){
Log.d("mytag", "google ok");
return true;
}
else{
Log.d("mytag","google not ok");
Toast.makeText(this, "GooglePlay is not available", Toast.LENGTH_SHORT).show();
}
return false;
}
private void setUpMap(){
if (googlemap == null){
Log.d("mytag", "googlemap is null, making it available");
googlemap = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
if (googlemap != null){
Log.d("mytag", "googlemap is not null");
googlemap.setMyLocationEnabled(true);
Runnable r = new Runnable() {
@Override
public void run() {
try {
url = new URL("http://thinktodo.net/LocationServiceSystem/index.php/location/getLocation?username=1");
conn = (HttpURLConnection) url.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
str = br.readLine();
JSONObject jsonObject = new JSONObject(str);
final double lat = jsonObject.getDouble("lat");
final double lng = jsonObject.getDouble("lng");
latlng = new LatLng(lat, lng);
marker = new MarkerOptions().position(new LatLng(latlng.latitude, latlng.longitude)).title("You are here");
googlemap.addMarker(marker);
googlemap.moveCamera(CameraUpdateFactory.newLatLng(latlng));
googlemap.animateCamera(CameraUpdateFactory.zoomTo(10));
br.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
};
Thread th = new Thread(r);
th.start();
}
}
}
}
main_activity.xml:
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.MapFragment"/>
问题是,您正在另一个线程上修改映射,因此应该在UI线程/主线程上修改映射
latlng = new LatLng(lat, lng);
marker = new MarkerOptions().position(new LatLng(latlng.latitude, latlng.longitude)).title("You are here");
googlemap.addMarker(marker);
googlemap.moveCamera(CameraUpdateFactory.newLatLng(latlng));
googlemap.animateCamera(CameraUpdateFactory.zoomTo(10));
这就是问题的根源
解决方案:
在doinbackground上使用“完成所有服务器连接”和“解析”,什么时候可以成功地在postexecute上修改映射?为什么不使用asynctask和sopportMapFragment?
latlng = new LatLng(lat, lng);
marker = new MarkerOptions().position(new LatLng(latlng.latitude, latlng.longitude)).title("You are here");
googlemap.addMarker(marker);
googlemap.moveCamera(CameraUpdateFactory.newLatLng(latlng));
googlemap.animateCamera(CameraUpdateFactory.zoomTo(10));