2014-07-16 112 views
0

場景非常簡單我有數組pArray它是在主函數中聲明的,因爲它必須返回它,因此必須有權訪問ti,數組會在偵聽器函數內部填充。訪問主函數內部封裝函數聲明的變量,並將其從主函數返回返回

我不能初始化它的功能,因爲它不是final,如果我最後標記它,我不能編輯它。

我試圖通過將返回類型從void更改爲String[][]來返回success函數中的某些內容,但這不被允許。

問題是我可以從監聽器函數返回一些東西來訪問它在主函數中,如果是的話我會獲得訪問返回的對象嗎?

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作爲場的全局變量,因爲它不真的有這個功能之外的任何目的。

回答

0

getStreams可能會產生另一個線程,這就是您附加回調的原因。

它會產生另一個線程,因爲它想要做一個長時間的運行操作,所以1它不會掛起主線程& 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


崩潰您的應用程序是什麼你應該do與異步處理

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