0

私はいくつかのマーカーを表示するためにGoogleマップを使用しています。マーカーはデータベースからダウンロードされ、同時に、ユーザーの現在の位置とデータベースから取得するマーカーの間のgoogle apiから距離行列が取得されます。ブロックせずに、私は同じやろうとしている今私のUIは、距離行列とGoogleマップでAsyncTaskを使用してブロックされています

dataFromAsyncTask = testAsyncTask.get(); 

私の問題は、私は(私はに.getは、UIをブロックすることを読んだ私のUIをbloking、に.getでこれをやったことがありますUIが、私は、このマーカーの距離を同時に、または良い方法で取得することはできませんよ。

私は、いくつかの助けをして下さい感謝。

これは私と私のコードです古いと間違って.get:

for (City city : listCity.getData()) { 
     geoPoint = city.getLocation(); 
    nameBeach = city.getName(); 

    if (geoPoint == null) { 

    } else { 
     latitude = String.valueOf(geoPoint.getLatitude()); 
     longitude = String.valueOf(geoPoint.getLongitude()); 

     startRetrievenDistanceAndDuration(); 

     try { 
      dataFromAsyncTask = testAsyncTask.get(); 
     } catch (InterruptedException i) { 

     } catch (ExecutionException e) { 
     } 

     mMap.addMarker(new MarkerOptions().position(new LatLng(geoPoint.getLatitude(), geoPoint.getLongitude())) 
       .title(nameCity) 
       .snippet(dataFromAsyncTask) 
       .icon(BitmapDescriptorFactory.defaultMarker())); 
    } 
} 

startRetrievenDistanceAndDuration方法:

private void startRetrievenDistanceAndDuration() { 
final String url; 

testAsyncTask = new DistanceBetweenLocations(new FragmentCallback() { 

    @Override 
    public void onTaskDone(String result) { 

    } 
}); 
url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" + currentLatitude + "," + currentlongitude + "&destinations=" + latitude + "," + longitude + "&key=xxx"; 
testAsyncTask.execute(new String[]{url}); 
} 
public interface FragmentCallback { 
    public void onTaskDone(String result); 

AsyncTaskクラス:

 @Override 
     protected String doInBackground(String... params) { 
      HttpURLConnection urlConnection = null; 
      URL url = null; 
      StringBuilder result = null; 
      String duration = ""; 
      String distance = ""; 

      try { 
       url=new URL(params[0]); 
      }catch (MalformedURLException m){ 

      } 
      try { 
       urlConnection = (HttpURLConnection) url.openConnection(); 
      }catch (IOException e){} 

      try { 
       InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
       result = new StringBuilder(); 
       String line; 
       while((line = reader.readLine()) != null) { 
        result.append(line); 
       } 
      }catch (IOException e){ 

      } finally { 
       urlConnection.disconnect(); 
      } 

      try { 
       JSONObject jsonObject = new JSONObject(result.toString()); 
       JSONArray jsonArray = jsonObject.getJSONArray("rows"); 
       JSONObject object_rows = jsonArray.getJSONObject(0); 
       JSONArray jsonArrayElements = object_rows.getJSONArray("elements"); 
       JSONObject object_elements = jsonArrayElements.getJSONObject(0); 
       JSONObject object_duration = object_elements.getJSONObject("duration"); 
       JSONObject object_distance = object_elements.getJSONObject("distance"); 

       duration = object_duration.getString("text"); 
       distance = object_distance.getString("text"); 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      return distance + ", " + duration; 

     } 

     @Override 
     protected void onPostExecute(String result) { 
      mFragmentCallback.onTaskDone(result); 
     } 
} 

私はこれをやろうとしているが、私は唯一の私のリストの最後のマーカーを示しています。

通話中にループメソッド:

startRetrievenDistanceAndDuration(); 

そしてonTaskDoneでマーカーを置くが、唯一のCHANGES後に更新

@Override 
      public void onTaskDone(String result) { 
       mMap.addMarker(new MarkerOptions().position(new LatLng(geoPoint.getLatitude(), geoPoint.getLongitude())) 
         .title(nameBeach) 
         .snippet(result) 
         .icon(BitmapDescriptorFactory.defaultMarker())); 

      } 

私のリストの最後のマーカーを取得しよう:(まだ動作しません) 私はAsynctask内のデータを解析して送信することができますonPostExecuteで、それが、私は一つの値だけ、と私は持っていない9つの値を取得する....

主な活動:

DistanceBetweenLocations task = new DistanceBetweenLocations(mlatituDouble, mlongitudeDouble){ 
        @Override 
        protected void onPostExecute(HashMap<String, String> result) { 
         super.onPostExecute(result); 

         String name = result.get("beachName"); 
         String distance = result.get("distance"); 
         String duration = result.get("duration"); 
         String latitue = result.get("latitude"); 
         String longitude = result.get("longitude"); 

         Double mlatituDouble = Double.parseDouble(latitue); 
         Double mlongitudeDouble = Double.parseDouble(longitude); 


         if (mMap == null) { 

          mMap = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.mapView)) 
            .getMap(); 

           Toast.makeText(getActivity(), "mMap NO null", Toast.LENGTH_SHORT).show(); 
           mMap.addMarker(new MarkerOptions().position(new LatLng(mlatituDouble, mlongitudeDouble)) 
             .title(name) 
             .snippet(distance + " " + duration) 
             .icon(BitmapDescriptorFactory.defaultMarker())); 
         } 
        } 
       }; 

       task.execute(); 

ASYNCTASKのCLASS :.

public class DistanceBetweenLocations extends AsyncTask<String, String, HashMap<String, String>> { 

    Double currentLatitude; 
    Double currentlongitude; 
    public BeachMap beachMap; 
    public BackendlessCollection<Beach> dataBeach; 
    public GoogleMap mMap; 
    String latitude; 
    String longitude; 
    HashMap<String, String> map; 

    public DistanceBetweenLocations(Double currentLatitude, Double currentlongitude){ 
     this.currentLatitude = currentLatitude; 
     this.currentlongitude = currentlongitude; 
    } 

    @Override 
    protected HashMap<String, String> doInBackground(String... params) { 

     dataBeach = beachMap.listBeach; 

     for (Beach city : dataBeach.getData()) { 
      GeoPoint geoPoint = city.getLocation(); 
      String nameBeach = city.getName(); 

      if (geoPoint == null) { 

      } else { 
       latitude = String.valueOf(geoPoint.getLatitude()); 
       longitude = String.valueOf(geoPoint.getLongitude()); 

       HttpURLConnection urlConnection = null; 
       URL url = null; 
       StringBuilder result = null; 
       String duration = ""; 
       String distance = ""; 

       try { 
        url = new URL("https://maps.googleapis.com/maps/api/distancematrix/json?origins=" + currentLatitude + "," + currentlongitude + "&destinations=" + latitude + "," + longitude + "&key=xxxx"); 
       } catch (MalformedURLException m) { 

       } 
       try { 
        urlConnection = (HttpURLConnection) url.openConnection(); 
       } catch (IOException e) { 
       } 

       try { 
        InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
        BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
        result = new StringBuilder(); 
        String line; 
        while ((line = reader.readLine()) != null) { 
         result.append(line); 
        } 
       } catch (IOException e) { 

       } finally { 
        urlConnection.disconnect(); 
       } 

       try { 
        JSONObject jsonObject = new JSONObject(result.toString()); 
        JSONArray jsonArray = jsonObject.getJSONArray("rows"); 
        JSONObject object_rows = jsonArray.getJSONObject(0); 
        JSONArray jsonArrayElements = object_rows.getJSONArray("elements"); 
        JSONObject object_elements = jsonArrayElements.getJSONObject(0); 
        JSONObject object_duration = object_elements.getJSONObject("duration"); 
        JSONObject object_distance = object_elements.getJSONObject("distance"); 

        duration = object_duration.getString("text"); 
        distance = object_distance.getString("text"); 


        map = new HashMap<String, String>(); 
        map.put("beachName", nameBeach); 
        map.put("distance", distance); 
        map.put("duration", duration); 
        map.put("latitude", latitude); 
        map.put("longitude", longitude); 


       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     return map; 
    } 

} 

答えて

1

私はあなたの最後のコード("を使用します変更後に更新される ")、ok?

私が正しいとすれば、あなたのの距離は、場所の間の範囲ビーチのジオロケーションデータのリストになります。だから、forループのすべての反復でdoInBackground、 "マップ"変数の値を置き換えている、これはあなたの問題です。

あなたの問題を解決するために、あなたはのHashMapのリストや、このようなPOJOのリスト持つことができます。POJOを使用して

public class BeachPojo { 
    private String beachName; 
    private String distance; 
    private String duration; 
    private String latitude; 
    private String longitude; 

    public String getBeachName() { 
     return beachName; 
    } 

    public void setBeachName(String beachName) { 
     this.beachName = beachName; 
    } 

    public String getDistance() { 
     return distance; 
    } 

    public void setDistance(String distance) { 
     this.distance = distance; 
    } 

    public String getDuration() { 
     return duration; 
    } 

    public void setDuration(String duration) { 
     this.duration = duration; 
    } 

    public String getLatitude() { 
     return latitude; 
    } 

    public void setLatitude(String latitude) { 
     this.latitude = latitude; 
    } 

    public String getLongitude() { 
     return longitude; 
    } 

    public void setLongitude(String longitude) { 
     this.longitude = longitude; 
    } 
} 

を、あなたのAsyncTaskは次のようになります。

public class DistanceBetweenLocations extends AsyncTask<String, String, List<BeachPojo>> { 

    Double currentLatitude; 
    Double currentlongitude; 
    public BeachMap beachMap; 
    public BackendlessCollection<Beach> dataBeach; 
    public GoogleMap mMap; 
    String latitude; 
    String longitude; 


    public DistanceBetweenLocations(Double currentLatitude, Double currentlongitude){ 
     this.currentLatitude = currentLatitude; 
     this.currentlongitude = currentlongitude; 
    } 

    @Override 
    protected List<BeachPojo> doInBackground(String... params) { 
     List<BeachPojo> list = new ArrayList<BeachPojo>(); 
     BeachPojo pojo; 

     dataBeach = beachMap.listBeach; 

     for (Beach city : dataBeach.getData()) { 
      GeoPoint geoPoint = city.getLocation(); 
      String nameBeach = city.getName(); 

      if (geoPoint == null) { 
      } else { 
       latitude = String.valueOf(geoPoint.getLatitude()); 
       longitude = String.valueOf(geoPoint.getLongitude()); 

       HttpURLConnection urlConnection = null; 
       URL url = null; 
       StringBuilder result = null; 
       String duration = ""; 
       String distance = ""; 

       try { 
        url = new URL("https://maps.googleapis.com/maps/api/distancematrix/json?origins=" + currentLatitude + "," + currentlongitude + "&destinations=" + latitude + "," + longitude + "&key=xxxx"); 
       } catch (MalformedURLException m) { 

       } 

       try { 
        urlConnection = (HttpURLConnection) url.openConnection(); 
       } catch (IOException e) { 
       } 

       try { 
        InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 
        BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
        result = new StringBuilder(); 
        String line; 
        while ((line = reader.readLine()) != null) { 
         result.append(line); 
        } 
       } catch (IOException e) { 

       } finally { 
        urlConnection.disconnect(); 
       } 

       try { 
        JSONObject jsonObject = new JSONObject(result.toString()); 
        JSONArray jsonArray = jsonObject.getJSONArray("rows"); 
        JSONObject object_rows = jsonArray.getJSONObject(0); 
        JSONArray jsonArrayElements = object_rows.getJSONArray("elements"); 
        JSONObject object_elements = jsonArrayElements.getJSONObject(0); 
        JSONObject object_duration = object_elements.getJSONObject("duration"); 
        JSONObject object_distance = object_elements.getJSONObject("distance"); 

        duration = object_duration.getString("text"); 
        distance = object_distance.getString("text"); 

        pojo = new BeachPojo(); 
        pojo.setBeachName(nameBeach); 
        pojo.setDistance(distance); 
        pojo.setDuration(duration); 
        pojo.setLatitude(latitude); 
        pojo.setLongitude(longitude); 

        list.add(pojo); 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
     return list; 
    } 
} 

これで、繰り返しのリストが作成されました。私は、この目標にコードを少し調整しています

DistanceBetweenLocations task = new DistanceBetweenLocations(mlatituDouble, mlongitudeDouble){ 
    @Override 
    protected void onPostExecute(List<BeachPojo> result) { 
     super.onPostExecute(result); 

     if (mMap == null) { 
      mMap = ((SupportMapFragment) getFragmentManager().findFragmentById(R.id.mapView)) 
        .getMap(); 
     } 

     Double beachLatitude; 
     Double beachLongitude; 

     for (BeachPojo pojo : result) { 
      beachLatitude = Double.parseDouble(pojo.getLatitude()); 
      beachLongitude = Double.parseDouble(pojo.getLongitude()); 

      mMap.addMarker(new MarkerOptions().position(new LatLng(beachLatitude, beachLongitude)) 
       .title(pojo.getBeachName()) 
       .snippet(pojo.getDistance() + " " + pojo.getDuration()) 
       .icon(BitmapDescriptorFactory.defaultMarker())); 
     } 
    } 
}; 

task.execute(); 

私はあなたがonPostExecute法上の結果throughtあなたのAsyncTaskとループからリストを返すの考えを理解してほしいです。

注:これは実際のコードを知らない実装です。それであなたの現実に適応する必要があります。

0

私はあなたが何をしようとしているのか正確には分かっていませんが、これはもっと複雑にしたと思います。

オブジェクトの作成に使用するJSONオブジェクトを取得するURLを作成するには、Cityオブジェクトのリストがあります。

あなたはこのようAsyncTaskを使用していることを行うことができます。

public class Task extends AsyncTask<City, Void, Markers> { 

    String currentLatitude; 
    String currentlongitude; 

    public Task(String currentLatitude, String currentlongitude){ 
     this.currentLatitude = currentLatitude; 
     this.currentlongitude = currentlongitude; 
    } 

    @Override 
    protected String doInBackground(City... cities) { 
     final Markers mMap = ...; 
     for (City city : cities) { 
      GeoPoint geoPoint = city.getLocation(); 
      String nameBeach = city.getName(); 

      if (geoPoint != null) { 
       String latitude = String.valueOf(geoPoint.getLatitude()); 
       String longitude = String.valueOf(geoPoint.getLongitude()); 

       HttpURLConnection urlConnection = null; 
       BufferedReader reader = null; 
       try { 
        URL url = new URL("https://maps.googleapis.com/maps/api/distancematrix/json?origins=" + currentLatitude + "," + currentlongitude + "&destinations=" + latitude + "," + longitude + "&key=xxx";); 
        urlConnection = (HttpURLConnection) url.openConnection(); 
        reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); 
        StringBuilder result = new StringBuilder(); 
        String line; 
        while ((line = reader.readLine()) != null) { 
         result.append(line); 
        } 
        JSONObject jsonObject = new JSONObject(result.toString()).getJSONArray("rows").getJSONObject(0).getJSONArray("elements").getJSONObject(0); 
        String duration = jsonObject.getJSONObject("duration").getString("text"); 
        String distance = jsonObject.getJSONObject("distance").getString("text"); 

        mMap.addMarker(new MarkerOptions().position(new LatLng(geoPoint.getLatitude(), geoPoint.getLongitude())) 
          .title(nameBeach) 
          .snippet(distance + ", " + duration) 
          .icon(BitmapDescriptorFactory.defaultMarker())); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } finally { 
        if(reader!=null){ 
         try { 
          reader.close(); 
         }catch (Exception e){ 
          e.printStackTrace(); 
         } 
        } 
        if (urlConnection != null) { 
         try { 
          urlConnection.disconnect(); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      } 
     } 

     return mMap; 
    } 
} 

そして、ここではこのタスクを使用する方法です。

public class Login extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(...); 
     Task task = new Task(currentLatitude, currentlongitude){ 
      @Override 
      protected void onPostExecute(Markers markers) { 
       super.onPostExecute(markers); 
       //This runs on the UI thread and "markers" is the "mMap" object that was create on the background thread. 
      } 
     }; 
     List<City> cities = .... 
     task.execute(cities.toArray(new City[cities.size()])); 
    } 
} 

アイデアは、あなたがAsyncTaskdoInBackground(...)方法では、すべての実行時間の長い操作を実行する必要があるということです。また、あなたはタスクのonPostExecute(...)あなたがでタスクを作成したクラスの内部を上書きすることができ、AsyncTask応答に対処するために他のオブジェクトを作成する必要はありません。

+0

あなたの答えをありがとう。センスがある!しかし、あなたのコードに1つの問題があります。 AsynctaskクラスのGoogleMapオブジェクトを返すことができます(私はGmapオブジェクトを作成する必要があるマーカーを追加できます)。doinbackgroundの返り値でこのエラーが発生しました:必須 'String'が 'com.android ... GoogleMap'を作成しました。 super.onPostExecute(マーカー)で同じ問題が発生しました。ありがとう – Simpson

+0

onPostExecute(GoogleMapsマーカー)の中にもう1つの質問があります。コードを追加する必要はありませんか?タスクがこのメソッドを終了すると、マーカをマップに配置すると仮定していますか? – Simpson

+0

@Simpsonあなたが言及した最初の問題は、クラスを 'public class Task AsyncTask 'として宣言していないために発生したと思います。おそらく 'public class Task AsyncTask < String、Void、String> ' – Titus

関連する問題