Java 等待线程,直到收到回调成功

Java 等待线程,直到收到回调成功,java,android,multithreading,callback,Java,Android,Multithreading,Callback,我正在调用一个从GoogleAPI检索位置列表的方法 nearByPlacesArray = gmObj.getNearbyPlaces(nameValuePairs); if (nearByPlacesArray != null) { for (int i = 0; i < nearByPlacesArray.length; i++) { nearbyPlaces.add(new mNearbyPlace(Integer.p

我正在调用一个从GoogleAPI检索位置列表的方法

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

另外,我已经在一个不同的异步线程(而不是主UI线程)上执行了所有这些操作,因此我想停止流不会是一个问题。

我认为,您在nearByPlacesArray上得到了一些响应。这就是为什么它会进入if块,所以当您从服务器收到错误消息/响应时就会发生这种情况。因为它将错误响应视为一个非空的东西,尽管它确实有错误的信息


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

您可以将结果添加到BlockingQueue,并让线程获取元素。
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;
    }