【问题标题】:How to avoid circular dependency between two classes?如何避免两个类之间的循环依赖?
【发布时间】:2013-02-22 08:56:00
【问题描述】:

我有两个类 - 一个定义 BaseActivity(我在应用程序中的所有活动的全局父级),另一个是 AsyncTask 类,我在其中定义了常见的网络操作。但我有下一个问题。 AsyncTask 在他的onPostExecute() 方法中名为RestfulNetworkTasks 的类必须调用在BaseActivity 类中定义的UpdateCurrentActivityAfterNetworkOperation(),但BaseActivity 类还必须创建RestfulNetworkTasks 的实例。这是清楚地说明这个问题的代码。

class RestfulNetworkTasks extends AsyncTask<Pair<String, LinkedHashMap<String, Object>>, Void, LinkedHashMap<String, Object>> {
    private ImmutableMap<String, Object> serverData_;
    NetworkOperation LowLevelRestOperations_ = new NetworkOperation();

    @Override
    protected LinkedHashMap<String, Object> doInBackground(Pair<String, LinkedHashMap<String, Object>>... params) {
        return LowLevelRestOperations_.executeServerCommand(params[0].getValue0(), params[0].getValue1());
    }

    protected void onPostExecute(LinkedHashMap<String, Object> result) {
        serverData_ = copyOf(result);
        BaseActivity instance_Activity = new BaseActivity(); 
        //BaseActivity injection (It is too bad to create Activity in such a way - I know!) So I need some piece of advice
        instance_Activity.UpdateCurrentActivityAfterNetworkOperation(serverData_);
        //Here I must call method for updating GUI after operation
    }

    public ImmutableMap<String, Object> GetDataFromServer() {
        return serverData_;
    }
}

public class BaseActivity extends Activity {

    RestfulNetworkTasks serverOperation_ = new RestfulNetworkTasks(); //RestfulNetworkTasks injection

    public void UpdateCurrentActivityAfterNetworkOperation(
        ImmutableMap<String, Object> server_data) {
    }// Here is this method which I will override in my child activities

    @SuppressWarnings("unchecked")
    public ImmutableMap<String, Object> Login(LinkedHashMap<String, Object> parameters) {
        Pair<String, LinkedHashMap<String, Object>> params_ = new Pair<String, LinkedHashMap<String, Object>>(LOGIN_COMMAND, parameters);
        serverOperation_.execute(params_);
        return serverOperation_.GetDataFromServer();
    }
}

如您所见,我在 RestfulNetworkTasks 和 BaseActivity 类之间存在循环依赖关系,这可能导致构造函数的无限链调用。

我该如何重构这个设计以避免这种情况?

【问题讨论】:

  • 你能再格式化一下你的代码吗?它现在有点不可读。尝试将其复制粘贴到 Eclipse 中并点击ctrl-shift-f

标签: java android dependency-injection circular-dependency


【解决方案1】:

AsyncTask 几乎总是会从 Activity 中调用,那么为什么不直接将它作为 Constructor 参数传入呢?

RestfulNetworkTasks.java:

private BaseActivity activity;

public RestfulNetworkTasks(BaseActivity activity){
    this.activity = activity;
}

BaseActivity.java:

new RestfulNetworkTasks(this).execute();

【讨论】:

    【解决方案2】:

    你不应该那样创建 Activity

    BaseActivity instance_Activity = new BaseActivity();
    

    活动由系统管理

    【讨论】:

    • 这是我遇到的另一个问题!所以任何解决方案如何避免这一切。如何重新设计代码?
    • @codeman 请仔细阅读我的帖子,看看我遇到的真正问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2011-03-12
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2013-04-02
    相关资源
    最近更新 更多