我正在实现一个类,该类负责我来自Blackberry的所有HTTP请求。我大约有10个左右的屏幕使用此类来查询Web服务并从中获取数据。在这种情况下使用的标准模式是什么?

目前,我将其设置如下-

public class NetworkAccessClass
{

    public NetworkAccessClass(String url, String methodName, Vector paramNames, Vector paramValues, MainScreen screen) {
        // perform inits
    }

    public void run() {
        // Get Data
        if(screen.instanceOf(LoginScreen)) {
            ((LoginScreen) screen).requestSucceded(responseData);
        }
        // So on for all 10 screens.
        catch() {
            ((LoginScreen) screen).requestFailed(errorCode);
            // So on for all 10 screens.
        }
    }

}


它可以工作,但是看起来不正确,如果单个屏幕上有多种类型的网络请求,我将被迫添加一个标志来跟踪它应该回调的功能。

有一个更好的方法吗?

谢谢,
特雅

最佳答案

使用回调接口,例如ResponseHandler

public class NetworkAccessClass
{

    public interface ResponseHandler {
        void requestSucceeded(ResponseData responseData);
        void requestFailed(ErrorCode errorCode);
    }

    public NetworkAccessClass(
        String url,
        String methodName,
        Vector paramNames,
        Vector paramValues,
        ResponseHandler responseHandler) {
        // perform inits
    }

    public void run() {
        // Get Data
        try {
            ...
            responseHandler.requestSuceeded(responseData);
        catch() {
            responseHandler.requestFailed(errorCode);
        }
    }
}


希望这可以使NetworkAccessClass脱离对所有屏幕的了解。然后屏幕要么实现NetworkAccessClass.ResponseHandler,要么它们传递适配器处理程序(匿名内部类)以在屏幕上调用适当的方法,例如

class LoginScreen {
    ...
        new NetworkAccessClass(url, methodName, paramNames, paramValues,
            new ResponseHandler() {
                @Override
                void requestSucceeded(ResponseData responseData) {
                    LoginScreen.this.handleLoginSuccess(responseData);
                }
                @Override
                void requestFailed(ErrorCode errorCode) {
                    LoginScreen.this.handleLoginFailure(errorCode);
                }
    }
    ...
}

10-07 15:31