Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 旅程监控-向地图添加标记时停止工作_Android_Google Maps - Fatal编程技术网

Android 旅程监控-向地图添加标记时停止工作

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

我的定位软件还可以。现在我的目的是将应用程序更改为旅程监控。这个想法是从一个包含车辆当前纬度和经度的网站上获取信息。我将url请求添加到一个可运行文件中。我收到了java.lang.IllegalStateException:Not on the main threadcom.google.android.gms.maps.internal.igoglemappdelegate$a$a.addMarker(未知源)com.google.android.gms.maps.GoogleMap.addMarker(未知源)。我怎样才能解决这个问题

活动:

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));