2016-12-17 13 views
-1

私は最終的なプロジェクトを作っていますが、立ち往生しています。 は私がfor forroid in android

final List<Results> ListStadium=response.body().getResults(); 
       for(int i=0;i<ListStadium.size();i++) 
       { 
        final Double latStadium,longStadium; 
        final String nameStadium; 
        latStadium = Double.parseDouble(ListStadium.get(i).getLatitude()); // *1 
        longStadium=Double.parseDouble(ListStadium.get(i).getLongitude()); //*2 
        nameStadium=ListStadium.get(i).getName(); //*3 

        ////////////////////////////////////////////// 

        mapFragment.getMapAsync(new OnMapReadyCallback() { 
         @Override 
         public void onMapReady(final GoogleMap googleMap) { 
          googleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN); 
          googleMap.getUiSettings().setZoomGesturesEnabled(true); 


          gpsTracker = new GPSTracker(UserDashboard.this); 

          // check if GPS enabled 
          if(gpsTracker.canGetLocation()){ 

           double latitude = gpsTracker.getLatitude(); 
           double longitude = gpsTracker.getLongitude(); 
           Log.e("Long: ",longitude+""); 
           Log.e("Lat: ",latitude+""); 
           googleMap.addMarker(new MarkerOptions() 
             .position(new LatLng(latStadium,longStadium)) 
             .title(nameStadium) 
             .snippet(GlobalVariable.Stadium_ID) 
             .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN))); 
           googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(10.7886087,106.6974835), 10)); 
           googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 
            @Override 
            public boolean onMarkerClick(Marker marker) { 
             GlobalVariable.Stadium_ID=marker.getSnippet(); 
             Toast.makeText(getApplicationContext(), marker.getTitle()+ " Here !", Toast.LENGTH_LONG).show(); 
             Intent intent = new Intent(UserDashboard.this,StadiumDetail.class); 
             startActivity(intent); 
             return false; 
            } 

           }); 

           progressDialog.dismiss(); 
          }else{ 
           // can't get location 
           // GPS or Network is not enabled 
           // Ask user to enable GPS/network in settings 
           gpsTracker.showSettingsAlert(); 
          } 

         } 
        }); 
       } 

しかし、プログラムが終了実行すると、それは私ではなくはmapFragment.getMapAsync()を実行し、自動増加* 1 * 2 * 3このループを実行し、以下のコードのようなループのためのリストと持っています。誰が私を助けられるか ?

+1

名前に基づいて、その非同期呼び出し。つまり、別のスレッドで発生し、返される前に結果を待つことはありません。マルチスレッドアプリケーションの作成方法については、読んでおく必要があります。 –

答えて

0

ループ内でを呼び出すべきではありません。これは非同期操作です。つまり、別のスレッドがマップをロードし、ロード時にコールバック経由で通知します。

マップを読み込み、コールバックを待ってから、そのコールバック内のforループにマーカーを作成する必要があります。

0

マークを作成するヘルパークラスを作成し、そのメソッドの結果をそのヘルプに送信し、非同期呼び出しの応答を待つことをお勧めします。

また、AsyncTaskを使用することもできます。AsyncTaskの結果に依存している場合は、これを行うことができます。オブジェクトの結果= asyncTask.execute()。get();結果の型は、doInBackground()メソッドの戻り値の型です。しかし、あなたのメインスレッドは、タスクが完了するまで待っています。