2017-10-08 7 views
0

AsyncTaskを使用してmysqlデータベースから緯度と経度を取得し、Map.Iで表示しようとしています。データベースから場所を取得するクラスを作成しました ここでは、私は上記の関数から位置を取得し、map.hereでそれを示す別の活性を有するデータベースあるアクティビティから別のアクティビティに場所を返すことはできません

public Location addEmployee() { 


    class AddEmployee extends AsyncTask<Void, Void, String> { 

     //ProgressDialog loading; 

     /* @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      loading = ProgressDialog.show(MainActivity.this, "Retreiving...", "Wait...", false, false); 
     }*/ 

     @Override 
     protected void onPostExecute(String success) { 
      // super.onPostExecute(success); 
      //loading.dismiss(); 

      try { 
       parseJSON(success); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

     } 


     @Override 
     protected String doInBackground(Void... v) { 
      HashMap<String, String> params = new HashMap<>(); 
      params.put("busid", busid); 

      RequestHandler rh = new RequestHandler(); 
      String res = rh.sendPostRequest("https://tkajbaje.000webhostapp.com/php/busid.php", params); 
      return res; 
     } 
     public void parseJSON(final String success) throws JSONException { 
      JSONObject jsonObject; 

      jsonObject = new JSONObject(success); 
      if (jsonObject.has("Latitude")) { 
       location.setLatitude(Double.valueOf(jsonObject.getString("Latitude"))); 

      } 
      if (jsonObject.has("Longitude")) { 
       location.setLongitude(Double.valueOf(jsonObject.getString("Longitude"))); 



      } 

     } 
    } 
    AddEmployee ae = new AddEmployee(); 
    ae.execute(); 
    return(location); 

} 

から位置コード

public void onMapReady(GoogleMap googleMap) { 
    // Add a marker in Sydney, Australia, 
    // and move the map's camera to the same location. 
    Bundle extras = getIntent().getExtras(); 
    String busid=String.valueOf(1); 
    Location location; 
    MainActivity activity=new MainActivity(busid); 
    location=activity.addEmployee(); 


    double Latitude=location.getLatitude(); 
    Toast.makeText(MapsMarkerActivity.this,String.valueOf(Latitude), Toast.LENGTH_LONG).show(); 



    double Longitude=location.getLongitude(); 

    LatLng sydney = new LatLng(Latitude, Longitude); 
    googleMap.addMarker(new MarkerOptions().position(sydney) 
      .title("Bus location")); 
    googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); 
} 

あるが、緯度と経度は常に0.0であることが起こります。

答えて

1

Cuzでは、AsyncTaskを開始し、ロケーションオブジェクト(そのオブジェクトの状態が何であれ)を返します。 AsyncTaskが実行を完了するのを待つことはありません。

ソリューション: - あなたは、そのクラスにインターフェイスを作成し、活動のインタフェースを実装したり、Classオブジェクトを匿名でそれを使用onPostExecute()で実行することができます。今、コールバックするたびに残りの仕事をすることができます。

1

locationがどこに定義されているかはわかりませんが、非同期コードと同期コードが混在しているようです。非同期タスクが完了する前に、この部分で

AddEmployee ae = new AddEmployee(); 
ae.execute(); 
return(location); 

は、あなたがしかし、ここでのキーワードは非同期で、タスクが成功した場合 location新しい値を代入します非同期タスクを起動し、ここで locationが返されます。リスナーを作成して onPostExecuteで呼び出すことができます。

MainActivity activity=new MainActivity(busid); 
location=activity.addEmployee(); 

ここでは、新しいクラスを作成し、そこにaddEmployee(およびアクティビティに固有のロジック以外のロジック)を配置することを強くお勧めします。新しいキーワードで新しいアクティビティを作成するのは良い方法ではありません。

+0

どのようにしてリスナーを作成し、それをonPostExecuteで呼び出すのですか? –

+0

SRB禁止は大まかな実装を説明しています。さらに、Javaコールバックを検索してさらに多くの例を見つけることができます。 1つの例は、https://stackoverflow.com/a/18279545/1364138です。 – merterpam

関連する問題