访问在封闭函数内的main函数中声明的变量,然后从main函数返回它

时间:2014-07-16 17:18:51

标签: java android

场景非常简单我有一个数组pArray,它在main函数中声明,因为它必须返回它,所以必须能够访问ti但是该数组会被填充到一个监听器函数中。

我无法在该函数内初始化它,因为它不是final,如果我将它标记为最终,我就无法编辑它。

我尝试通过将其返回类型从void更改为success来从String[][]函数返回一些内容,但这是不允许的。

问题是我可以从监听器函数返回一些东西,以便在main函数内访问它,如果是,我将获得对返回对象的访问权限吗?

private String[][] GetGooglePlaces(List<NameValuePair>[] nameValuePairs) {
    String[][] pArray = null;
        try {   
            iGPlaceApi.getStreams(itemsPerPage, pageNumber * itemsPerPage, new Callback<mGooglePlacesApiResponse>() {

                @Override
                public void failure(RetrofitError retrofitError) {
                    //TODO
                }

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

                    }

                }
            });
        return pArray;
    }

我不想将pArray声明为全局变量字段,因为它在此函数之外并没有任何用途。

1 个答案:

答案 0 :(得分:0)

getStreams可能会产生另一个线程,这就是你附加回调的原因。

它会产生另一个线程,因为它想要做一个长时间运行的操作,所以1它不会挂起主线程&amp; 2您可以向用户提供一些其他反馈,直到它返回答案(在其回调中)。

所以你不应该从这个方法获得返回值,你应该监听回调并做出适当的响应。 说你可以破解它

private String[][] GetGooglePlaces(List<NameValuePair>[] nameValuePairs) {
    String[][] pArray = null;

        CountDownLatch countDownLatch = new CountDownLatch(1); // Set up a latch 

        try {   
            iGPlaceApi.getStreams(itemsPerPage, pageNumber * itemsPerPage, new Callback<mGooglePlacesApiResponse>() {

                @Override
                public void failure(RetrofitError retrofitError) {
                    //TODO
                }

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

                    }
                    countDownLatch.countDown(); // unlock the latch when you get your callback
                }
            });

        try {
            countDownLatch.await(30, TimeUnit.SECONDS);  // make it wait before you return
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

        return pArray;
    }

注意如果您在主线程上运行此操作,则会使用ANR崩溃您的应用


你应该做的是处理这个不同寻常的

private void getGooglePlaces(GooglePlacesListener finishedListener) {
        try {   
            iGPlaceApi.getStreams(itemsPerPage, pageNumber * itemsPerPage, new Callback<GooglePlacesApiResponse>() {

                @Override
                public void failure(RetrofitError retrofitError) {
                    finishedListener.onFailure();
                }

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

                    }
                    finishedListener.onRetrieved(pArray);
                }
            });
    }

  public interface GooglePlacesListener {
       void onRetrieved(String[][] places);
       void onFailure();
  }