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

时间:2014-07-20 20:01:42

标签: java android multithreading callback

我正在调用一种从Google 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线程上做了所有这些,所以我想这个停止流程不会是一个问题。

1 个答案:

答案 0 :(得分:0)

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

要处理此问题,您需要在&#34; Callback&#34;中实现一些验证功能。接口。这将解决问题。