2016-08-20 52 views
2

在我的Android应用程序中,当我从后端读取段落时,我想实现成功和错误回调。在iOS中,它应该是这样的:Android - Java块等价的回调?

在我Passage.h:

-(void)getPassagesWithSuccessCallback:(void (^)(NSArray<Passage *> *))success errorCallback:(void (^)(NSString *))errorString; 

在我Passage.m:

-(void)getPassagesWithSuccessCallback:(void (^)(NSArray<Passage *> *))success errorCallback:(void (^)(NSString *))errorString { 
    MyApiInterface* api = [MyApiInterface sharedInstance]; 
    [api sendGetRequestTo:@"passages" successCallback:[Passage modelListCallback:success] errorCallback:error]; 
} 

在我的Android应用程序,我使用Volley到处理我的API请求,但我想通过使用带有public static void方法的Passage.java类进一步封装此API接口。这样的事情:

public static void getPassagesForFirebaseUser(FirebaseUser user, Context context) { 
     final String url = URL_BASE + "/passages.json" + "?auth=" + user.getToken(false); 
     final JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 
       // convert JSON into ArrayList<Passage> object 
       // pass on this array of Passages in the success completion listener of the method that called this 
       // just like iOS does success(passages) 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       // convert error to string 
       // pass on this errorString in the error completion listener of the method that called this 
       // just like iOS does error(errorString) 
      } 
     }); 
     Volley.newRequestQueue(context).add(request); 
} 

有什么办法可以得到这种实现流程吗?

+1

为您的回调定义一个接口,将其中的一个实例传递给'getPassagesForFirebaseUser()',并调用onResponse()和/或onErrorResponse()方法。 IOW,通过将'Response.Listener'和'Response.ErrorListener'的实例传递给'JsonObjectRequest'构造函数,您就可以完成Volley所要做的事情。 – CommonsWare

+0

感谢CommonsWare。您的评论和Joa Barcena的回答非常有帮助! – Rafi

回答

4

您可以使用接口

public interface ICallbacks { 
    public void onResponse(JSONObject response); 
    public void onError(VolleyError error); 
} 

然后在你日常的代码只是把回调(取决于你的工作能自动生成方法IDE)的新实例

public static void getPassagesForFirebaseUser(FirebaseUser user, 
Context context, ICallbacks events) { 
//here code and call ICallbacks methods 
if(result){ events.onResponse(response); } 
if(error){ events.onError(err); } 
} 

最终你可以打电话给方法:

getPassagesForFirebaseUser(user, context, new ICallbacks(){ 
    @Override 
    public void onResponse(JSONObject response){ 
     //Success !!! 
    } 
    @Override 
    public void onError(VolleyError response){ 
     //Error !!! 
    } 
}); 

对不起,我的英文,希望对您有所帮助!

+0

所以我可以做同样的事情,例如'onResponse(ArrayList passage)',它会工作得很好?这非常有趣。看起来像我一直在使用Objective-C并远离Java太久了! – Rafi

+1

是的!你可以!!,当我听说我开始使用无处不在哈哈 –

+0

@joa谢谢!这个简单的例子真的有用 – ArdenDev