2015-05-29 67 views
0

我是新來的Java,我有一個方法,我試圖從Parse.com中使用包裝進行異步服務器調用。我想返回一個自定義對象,其中包含我從調用中獲得的信息,但是我得到了「錯誤:未知類」 基本上,我試圖阻止此方法返回,直到完成()被調用。如何從具有內部類的方法返回

我不知道java如何處理這種事情,我習慣於在Objective-C中工作。有沒有人知道我可以有沒有調用返回聲明,直到我設置完成()的屬性?

public ServerResponse getRestaurauntProfile(){ 

    ParseQuery<ParseObject> profileQuery = ParseQuery.getQuery("Restaurant"); 
    profileQuery.whereEqualTo("user", ParseUser.getCurrentUser()); 
    profileQuery.findInBackground(new FindCallback<ParseObject>() { 

    final ServerResponse mResponse = new ServerResponse(); 

     @Override 
     public void done(List<ParseObject> list, ParseException e) { 

      if (e == null) { 
       mResponse.setReturnObject(list.get(0)); 
       mResponse.setReturnException(null); 

      } else { 
       mResponse.setReturnObject(null); 
       mResponse.setReturnException(e); 

      } 

     } 

     return mResponse; 

    }); 
} 
+0

聽起來的AsyncTask可能是一個很好的方法(http://developer.android.com/reference/android/ os/AsyncTask.html) – Nija

+0

就像@Nija說的,把你的異步任務放到一個AsyncTask中,然後在postExecute方法中做你想做的事情 –

+1

「我試圖阻止這個方法返回,直到done()被調用」 - 所以你試圖修改異步行爲以進行同步(通過將呼叫設置爲「阻止」)。 AFAIK Android不允許阻止來自幾個版本的呼叫(薑餅 - 我認爲)。您必須將代碼修改爲異步 - 通過觸發回調中的「發佈操作」。 – alfasin

回答

0

一個很好的解決方案是使用Retrofit from Square。 Retrofit是處理異步網絡調用的優秀庫。正如用戶alfasin在評論中所說的,您試圖強制異步方法同步行動,這在Android中是一個不容忽視的問題。如果你想繼續使用當前的代碼結構,可以大致重組它是這樣的:

public void getRestaurauntProfile(){ 

    ParseQuery<ParseObject> profileQuery = ParseQuery.getQuery("Restaurant"); 
    profileQuery.whereEqualTo("user", ParseUser.getCurrentUser()); 
    profileQuery.findInBackground(new FindCallback<ParseObject>() { 

    final ServerResponse mResponse = new ServerResponse(); 

     @Override 
     public void done(List<ParseObject> list, ParseException e) { 

      if (e == null) { 
       mResponse.setReturnObject(list.get(0)); 
       mResponse.setReturnException(null); 
       handleResponse(mResponse); 
      } else { 
       mResponse.setReturnObject(null); 
       mResponse.setReturnException(e); 
       handleResponse(mResponse); 
      } 
     } 
    }); 
} 

public void handleServerResponse(ServerResponse mResponse){ 
    //do whatever code handling you need here 
} 
相關問題