2016-10-19 7 views
0

Googleマップへのhttpリクエストを使用して高度の取得を試みます。残念ながら、私は応答を受け取りますが、私はそれを使用することはできません。このコードでは、場所の高度を設定しようとしましたが、機能しません。高度は、私のOnResponseメソッドでは正しいですが、それは他の場所では間違っています。理由は何ですか?httpリクエストからの返却値(Volleyを使用)

あなたがそうのようなコールバック・インターフェースを使用したい
public class MainActivity extends AppCompatActivity { 
Location location = new Location(""); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    location.setLatitude(39.7391536); 
    location.setLongitude(-104.9847034); 
    getElevation(); 
    Log.d("OnCreate", ""+location.getAltitude()); //print OnCreate: 0.0 

} 

public void getElevation(){ 
    String urlName = "https://maps.googleapis.com/maps/api/elevation/json?locations=" 
      +location.getLatitude()+","+location.getLongitude() 
      +"&key=mykey"; 


    RequestQueue queue = Volley.newRequestQueue(this); 

    JsonObjectRequest requester = new JsonObjectRequest(urlName, null, new Response.Listener<JSONObject>() { 

     @Override 
     public void onResponse(JSONObject response) { 
       TextView mTxtDisplay = (TextView) findViewById(R.id.elevation); 
       double altitude; 

      try { 
       altitude = response.getJSONArray("results").getJSONObject(0).getDouble("elevation"); 
       mTxtDisplay.setText("Elevation : " + altitude); 
       location.setAltitude(altitude); 
       Log.d("OnResponse", ""+location.getAltitude()); //print OnResponse: 1608.637939453125 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      //TODO 
     } 
    }); 
    queue.add(requester); 
    } 
} 
+0

要求が非同期になるまでonResponse以内にその値を取得し、その値に依存しているものの実行を遅らせる、あなた要求が完了した後、 'location.getAltitude()'の結果を取得します。 –

+0

他のすべての場所で間違っているとはどういう意味ですか?あなたはVolleyリクエストのみを表示しました。なぜあなたはその反応を使用できないのですか?あなたは明示的にonResponse内の値を取得していると言っていますので、あなたはそれを "使用しています" –

+0

そして、Android用のGoogle Maps APIがあります。なぜあなたはVolleyを使う必要があるのか​​よく分かりません。 –

答えて

0

:アクティビティ内

public void getString(final VolleyCallback callback) { 
StringRequest strReq = new StringRequest(Request.Method.GET, url, new  Response.Listener<String>() { 
    @Override 
    public void onResponse(String response) { 
     result=response; 
     callback.onSuccess(result); 
    } 
    }... 
}} 

public interface VolleyCallback{ 
void onSuccess(String result); 
} 

サンプルコード作業。

はい、自分自身と言っても問題ありません。

高度はあなたが

を言うとき、それは他の場所で間違っている、だから私のOnResponse方法

で正しいです。

これは間違っていません。unitializedです。ボレーはただちに仰角の結果を返すだけではありません。したがって、0を出力するログ文は、値を出力するonResponseの前に発生します。

ので、「ボレーから値を返す方法」に答えるために、あなたはすでにそれをやっている - そして、

+0

多くの感謝!私の(いいえ)問題は解決されました! –

0

:私は場所の高度を設定しようとするが、それはない

public void onResume(){ 
super.onResume(); 
getString(new VolleyCallback(){ 
    @Override 
    public void onSuccess(String result){ 
     ... //do stuff here 
    } 
    }); 
} 
+0

自分で定義する必要はありませんインタフェース。 Volleys Response.Listenerインターフェイスを使用してください –

関連する問題