2014-07-20 38 views
0

我打電話的方法,從谷歌API檢索地點列表。等待線程,直到收到回調成功

nearByPlacesArray = gmObj.getNearbyPlaces(nameValuePairs); 
    if (nearByPlacesArray != null) { 
      for (int i = 0; i < nearByPlacesArray.length; i++) { 
       nearbyPlaces.add(new mNearbyPlace(Integer.parseInt(nearByPlacesArray[i][0]), nearByPlacesArray[i][1], Double.parseDouble(nearByPlacesArray[i][2]), Double.parseDouble(nearByPlacesArray[i][3]))); 
      } 
     } 

然後構建一個列表並將它傳遞給一個微調適配器。

函數getNearbyPlaces異步運行並使用Retrofit success回調來構建位置列表並解析它。

當我調用這個函數時,它返回一個空對象,並在nearByPlacesArray爲空時移動到下一行創建列表。

我想以某種方式停止處理,直到調用success方法,因此返回的nearByPlacesArray不爲空。

我該怎麼做?

public String[][] getNearbyPlaces(List<NameValuePair> nameValuePairs) { 

     try { 
      … 
      RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(finalUri.toString()).build(); 
      IGooglePlacesApi iGPlaceApi = restAdapter.create(IGooglePlacesApi.class); 

      iGPlaceApi.getStreams(new Callback<mGooglePlacesApiResponse>() { 

       @Override 
       public void failure(RetrofitError retrofitError) { 
        String serverResponse = retrofitError.toString(); 
       } 

       @Override 
       public void success(mGooglePlacesApiResponse googlePlacesObj, Response arg1) { 
        nearbyPlaces = new String[googlePlacesObj.results.size()][4]; 
        for (int i = 0; i < googlePlacesObj.results.size(); i++) { 
         mGooglePlaces.place place = googlePlacesObj.results.get(i); 
         nearbyPlaces[i][0] = place.icon; 
         ... 
        } 

       } 
      }); 
     } 
     … 
     finally { 
      Log.d("serverResponse:", serverResponse); 
     } 

     return nearbyPlaces; 
    } 

P.S.我已經在不在主UI線程上的不同async線程上執行所有這些操作,因此暫停流程不會是我想的問題。

+0

您可以將結果添加到BlockingQueue並讓線程獲取()一個元素。 –

回答

0

我想,你正在接近nearByPlacesArray的迴應。這就是爲什麼它會進入內部,所以當你從服務器收到錯誤消息/響應時會發生。因爲它將錯誤響應視爲非空的東西,雖然它確實有錯誤的信息。

要處理這個問題,您需要在「回調」界面中實現一些驗證功能。這將解決問題。

相關問題