2013-06-06 20 views
0

我有一个实现谷歌Maps.When的活动我开始吧,活动停止几秒钟,直到地图是完全加载。 我想使用ProgressDialog,直到地图不加载,但我无法在后台线程中启动它,因为必须在主线程中加载地图,如this link中所述。机器人 - ProgressDialog在加载谷歌地图

如何在不使用AsyncTask的情况下做到这一点?

否则,有没有立即启动活动,并显示有一样的谷歌地图应用程序中的灰色背景的未加载地图的方式?

这就是onCreate方法的代码:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_mappa); 
    databaseHelper = new MyDatabaseHelper(this); 
    Bundle b = getIntent().getExtras(); 
    String placeAddress= ""; 
    if(b != null) 
     placeAddress= b.getString("indirizzo"); 

    setUpMapIfNeeded(); 
    gMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
    gMap.setMyLocationEnabled(true); 
    UiSettings settings = gMap.getUiSettings(); 
    settings.setMyLocationButtonEnabled(true); 

    LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    Criteria criteria = new Criteria(); 
    String provider = locationManager.getBestProvider(criteria, false); 
    Location location = locationManager.getLastKnownLocation(provider); 
    double lat = location.getLatitude(); 
    double lng = location.getLongitude(); 
    position = new LatLng(lat, lng); 

    if(!placeAddress.equals("")){ 
     Geocoder geocoder = new Geocoder(this, Locale.getDefault()); 
     List<Address> indirizzi = null; 
     try { 
      indirizzi = geocoder.getFromLocationName(placeAddress, 1); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     double latLuogo = indirizzi.get(0).getLatitude(); 
     double lngLuogo = indirizzi.get(0).getLongitude(); 
     LatLng luogo = new LatLng(latLuogo, lngLuogo); 
     CameraPosition cameraPosition = new CameraPosition.Builder() 
      .target(luogo) 
      .zoom(15) 
      .build(); 
     gMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 
    } 
    else{ 
     CameraPosition cameraPosition = new CameraPosition.Builder() 
       .target(position) 
       .zoom(15) 
       .build(); 
     gMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 
    } 

    LocationListener listener = new LocationListener() { 
      public void onLocationChanged(Location location){ 
       //makeUseOfNewLocation(location); 
      } 

      @Override 
      public void onProviderDisabled(String arg0) {} 

      @Override 
      public void onProviderEnabled(String arg0) {} 

      @Override 
      public void onStatusChanged(String provider, int status, Bundle extras) {} 
    }; 

    locationManager.requestLocationUpdates(provider, 0, 10, listener); 

    ConnectivityManager connMngr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
    final NetworkInfo netInfo = connMngr.getActiveNetworkInfo(); 

    if(checkConnection(netInfo) == true){ 
    loadFromDatabase(); //load markers 

    gMap.setInfoWindowAdapter(new InfoWindowAdapter(){ 

     @Override 
     public View getInfoWindow(Marker marker) { 
      return null; 
     } 

     @Override 
     public View getInfoContents(Marker marker) { 
      String nome = marker.getTitle(); 
      String indirizzo = marker.getSnippet(); 
      View v = getLayoutInflater().inflate(R.layout.info_window_layout, null); 
      TextView title = (TextView)v.findViewById(R.id.titleInfoWindow); 
      title.setText(nome); 
      TextView snippet = (TextView)v.findViewById(R.id.snippetInfoWindow); 
      snippet.setText(indirizzo); 
      ImageView imView = (ImageView)v.findViewById(R.id.info_windowImageView); 
      impostaImmagine(imView, nome); 
      return v; 
     } 
    }); 

    gMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() { 

     @Override 
     public void onInfoWindowClick(Marker marker) { 
      final String nome = marker.getTitle(); 
      final String indirizzo = marker.getSnippet(); 
      startLuogoActivity(nome, indirizzo); 
     } 
    }); 

    final Geocoder geocoder = new Geocoder(this, Locale.getDefault()); 

    gMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() { 

     @Override 
     public void onMapLongClick(LatLng point) { 
      List<Address> addresses = null; 
      if(checkConnection(netInfo) == true){ 
       try { 
        addresses = geocoder.getFromLocation(point.latitude, point.longitude, 1); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       if(addresses!=null){ 
        String address = addresses.get(0).getAddressLine(0); 
        String city = addresses.get(0).getAddressLine(1); 
        String country = addresses.get(0).getAddressLine(2); 
        String indirizzo = address + ", " + city + ", " + country; 
        final Dialog addByClickDialog = onCreateDialogADDByClick(getBaseContext(), indirizzo); 
        addByClickDialog.show(); 
        Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
        v.vibrate(50); 
       }else{ 
        final Dialog nessunaConnessioneDialog = onCreateDialogNessunaConnessione(getBaseContext()); 
        nessunaConnessioneDialog.show(); 
        Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
        v.vibrate(50); 
       } 
      } 
      else{ 
       final Dialog nessunaConnessioneDialog = onCreateDialogNessunaConnessione(getBaseContext()); 
       nessunaConnessioneDialog.show(); 
       Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
       v.vibrate(50); 
      } 
     } 
    }); 

    Button addButton = (Button)findViewById(R.id.addButton); 
    final Dialog addDialog; 
    if(checkConnection(netInfo) == false){ 
     addDialog = onCreateDialogADD(getBaseContext(), false); 
    }else{ 
     addDialog = onCreateDialogADD(getBaseContext(), true); 
    } 
    addButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      addDialog.show(); 
     } 
    }); 

    Button deleteButton = (Button)findViewById(R.id.deleteButton); 
    final Dialog deleteDialog; 
    if(checkConnection(netInfo) == false){ 
     deleteDialog = onCreateDialogDELETE(getBaseContext(), false); 
    }else{ 
     deleteDialog = onCreateDialogDELETE(getBaseContext(), true); 
    } 
    deleteButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      deleteDialog.show(); 
     } 
    }); 
} 
+0

显示您的代码的主要部分。所以我可以帮你.. – Riser

+0

你使用MapActivity或MapFragment吗? –

+0

为什么需要几秒钟?除非你在主线上做了额外的事情,否则地图加载速度很快 –

回答

0

我终于解决了这个问题!我使用了this tutorial中的代码。

所有我不得不做的是,其中存在于所述加载的地图,并在该代码点的标记物“的setContentView(R.layout.main);”呼叫。

+1

那么你是如何设法添加进度对话框的,请提前致谢 –

0

检查ProgressDialog not shown in UIThread问题的答案通过@commonsware。对于MapActivity使用ProgressDialog可能不是一个好主意,因为显示MapView所需的时间主要依赖于Internet连接返回到Google Maps服务器。您无法知道MapView何时完成加载,因此您无法知道何时关闭对话框。但是,如果您确信它会始终加载并且需要更少的时间,那么您可以阅读更多here。你也可以看到相关的问题,它指向同一个链接:Android : showDialog when setContentView loading

希望这有助于。

+0

是的,主要的问题是互联网连接。如果我打开带有WiFi连接的MapFragment,它不需要太多的加载。但是如果我用3G连接做它,它可以需要很多秒,所有的应用程序停止响应。我会尝试在你发布的链接中的解决方案,并让你知道它是否工作。 – user2328149