2014-07-20 37 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的回应。这就是为什么它会进入内部,所以当你从服务器收到错误消息/响应时会发生。因为它将错误响应视为非空的东西,虽然它确实有错误的信息。

要处理这个问题,您需要在“回调”界面中实现一些验证功能。这将解决问题。

相关问题