2016-10-19 102 views
0

我嘗試通過http請求獲取Google地圖的位置高度。不幸的是,我收到了一個回覆,但我無法使用它。在這段代碼中,我嘗試設置一個位置的高度,但它不起作用。我的OnResponse方法的高度是正確的,但在其他地方是錯誤的。你有什麼想法,爲什麼?使用Volley從http請求返回值

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

你是什麼意思這是錯誤的其他地方?您只顯示了排球請求。爲什麼你不能使用迴應?您明確表示您在onResponse中獲得了價值,因此您正在「使用它」 –

+0

並且有一個適用於Android的Google Maps API,因此我不確定爲什麼您需要使用Volley –

回答

0

我嘗試設置位置的高度,但它不工作。

是它的工作,因爲你說你自己。

海拔高度是正確的,我OnResponse方法

所以,當你說

這是錯誤的其他地方。

這沒有錯,它是單元化的。排球不會立即返回高程的結果。因此,打印0的日誌語句發生在打印該值的onResponse之前。

因此,要回答「如何從凌空返回值」,你已經在做的是 - 獲得依賴於該值,直到再

+0

非常感謝!我的(沒有)問題解決了! –

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); 
} 

示例代碼活動中:

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

您不需要定義自己的接口。只需使用Volleys Response.Listener界面 –