2013-06-06 1 views
0

나는 내가 그것을 시작 구글 Maps.When를 구현하는 활동을, 활동이 몇 초 동안 정지 Google지도를로드하는 동안. this link에서 설명한 것처럼지도가로드되지 않을 때까지 ProgressDialog를 사용하고 싶지만 기본 스레드에서지도를로드해야하므로 백그라운드 스레드에서 시작할 수 없습니다.안드로이드 -해서 ProgressDialog지도가 완전히로드 될 때까지,

본인은 AsyncTask를 사용하지 않고 그것을 어떻게 만들 수 있습니까?

그렇지 않으면, 바로 활동을 시작하고 Google지도 응용 프로그램처럼 회색 배경과로드되지지도를 표시하는 방법은 무엇입니까? 에서 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으로 대답. ProgressDialog를 MapActivity 용으로 사용하는 것은 좋지 않을 수 있습니다. 이는 MapView를 표시하는 데 걸리는 시간이 대부분 Google Maps 서버에 대한 인터넷 연결에 의존하기 때문입니다. MapView의로드가 완료된 시점을 알 수 없으므로 대화 상자를 닫을시기를 알 수 없습니다. 하지만 항상로드되고 시간이 오래 걸릴 것이라는 확신이 든다면 here을 더 읽을 수 있습니다. 이 도움이 Android : showDialog when setContentView loading

희망 : 당신은 또한이 같은 링크를 가리키는 질문을 관련 참조 할 수 있습니다.

+0

예, 주요 문제는 인터넷 연결입니다 .Wifi 연결로 MapFragment를 열면 많은 부하가 걸리지 않습니다.하지만 3G 연결로 할 수 있습니다. 몇 초가 지나면 모든 응용 프로그램이 응답을 멈 춥니 다. 게시 한 링크에서 솔루션을 사용해보고 작동하는지 알려줍니다. – user2328149