所以我正在基于我也在研究的iOS应用程序用Java编写一个Android应用程序,但这个问题更多的是询问如何在Java中通信回调机制(如Objective-C 2.0中的块)。
此应用程序涉及通过 API 与服务器联网、身份验证和通信。
我正在使用这个框架:https ://github.com/loopj/android-async-http
我正在尝试将所有网络模型封装到类中,以使一切变得干净和简单(在 iOS 中使用委托和块似乎很容易,但 java 似乎没有任何这些便利)。因此,我将其用作回调指南:http ://www.gdgankara.org/2013/03/25/android-asynchronous-http-client-a-callback-based-http-client-library-for- android-and-android-smart-image-view/
现在假设我不想从 Activity 类进行调用,而是可以从 Activity 类调用的 API 类,我该怎么做?我很容易知道如何在 iOS 中使用块和委托来做到这一点,但是如何使用接口来做到这一点?
例如:
在iOS中(使用称为 AFNetworking 的通用网络框架),我有 4 个类:
HTTPClient.h/m
+(id)sharedHTTPClient
{
static dispatch_once_t pred = 0;
__strong static id __httpClient = nil;
dispatch_once(&pred, ^{
NSString *baseURL = http://baseurl.com;
__httpClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:baseURL]];
[__httpClient setParameterEncoding:AFJSONParameterEncoding];
});
return __httpClient;
}
APILogin.h/m
-(void)loginWithSuccessBlock:(void (^)(NSArray *responseArray))loginSuccess {
HTTPClient *httpClient = [HTTPClient sharedHTTPClient];
NSURLRequest *request = [httpClient requestWithMethod:@"GET" path:@"/api/login" parameters:nil];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSArray *response = [self.jsonParser parseResponseFromJSON:JSON];
if (loginSuccess) {
loginSuccess(response);
}
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
[APIErrorHandler handleError:error withHTTPResponse:response];
}];
[operation start];
}
登录对象.h/m
-(id)init
{
self = [super init];
if(self) {
[self.apiLogin loginWithSuccessBlock:^ void (NSArray *loginArray) {
//process the array
}];
}
}
登录VC.h/m
...
LoginObject *loginObj = [[LoginObject alloc] init];
...
所以,现在我到目前为止,使用 Android-Async-Http 库是:
HTTPClient.java
public class HTTPClient extends AsyncHttpClient {
public static HTTPClient sharedHTTPClient;
public static String baseUrl = "http://baseurl.com";
public HTTPClient {
super();
}
...
}
APILogin.java
public class APILogin {
public void loginWithSuccessBlock() {
HTTPClient httpClient = QHTTPClient.sharedHTTPClient;
httpClient.get("/api/login", new JsonHttpResponseHandler() {
@Override
public void onSuccess(JSONArray response) {
// Successfully got a response
ArrayList<LoginObject> loginInfo = this.jsonParser.parseLoginFromJSON(response);
**NEED TO DO A CALL BACK!! Like with the blocks in iOS**
}
@Override
public void onSuccess(JSONObject response) {
// Successfully got a response
// shouldn't be an object
throw new IllegalArgumentException();
}
@Override
public void onFailure(Throwable e, String response) {
// Response failed :(
}
});
}
登录对象.java
public class LoginObject {
public LoginObject {
this.apiLogin.loginWithSuccessBlock(**something something for a callback**);
}
}
希望我已经更清楚地说明了我想要实现的目标。我希望能够在成功时对调用 api 调用的对象执行某种回调块。但是,它并不总是同一个对象。LoginObject 可能有一个 APILogin.java 的实例,因此可能有一个不同的对象,所以我不能使用上面的第二个链接,您可以在其中指定一个特定的类并将其传入并调用它的方法,因为这些类将是不同类型的,Java 没有通用指针(id 或 void*)对象。