2013-06-06 4 views
0

У меня есть активность, которая реализует Карты Google. Когда я запускаю ее, действие останавливается на несколько секунд, пока карта не будет полностью загружена. Я бы хотел использовать ProgressDialog, пока карта не загрузится, но я не могу запустить ее в фоновом потоке, так как карта должна быть загружена в основной поток, как описано в this link.android - ProgressDialog при загрузке Google Maps

Как это сделать без использования AsyncTask?

В противном случае, есть способ немедленно начать работу и показать загруженную карту с серым фоном, как и приложение Google Maps?

Это код 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

Проверить ответ на @commonsware на ProgressDialog not shown in UIThread вопрос. Возможно, неплохо использовать ProgressDialog для MapActivity, поскольку время, необходимое для отображения MapView, в основном зависит от подключения к Интернету на серверах Google Maps. У вас нет возможности узнать, когда загружается MapView, поэтому у вас нет способа узнать, когда следует отменить диалог. Но все же, если вы очень уверены, что он будет всегда загружаться и займет меньше времени, вы можете прочитать больше here. Вы также можете просмотреть связанный вопрос, который указывает на ту же связь: Android : showDialog when setContentView loading

Надеюсь, что это поможет.

+0

Да, основная проблема связана с подключением к Интернету. Если я открою MapFragment с помощью Wi-Fi-соединения, загрузка не займет много времени. Но если я это сделаю с помощью 3G-соединения, это может занять много секунд, и все приложения перестанут отвечать. Я попробую решение в указанной вами ссылке и сообщит, работает ли оно. – user2328149

Смежные вопросы