简体   繁体   English

如何避免两个类之间的循环依赖?

[英]How to avoid circular dependency between two classes?

I have two classes - one defines BaseActivity (a global parent for all my activities in the app) and other is an AsyncTask class in which I defined common networking operation. 我有两个类-一个定义BaseActivity (应用程序中所有活动的全局父类),另一个是AsyncTask类,在其中定义了通用的网络操作。 But I have next problem. 但是我有下一个问题。 AsyncTask class named RestfulNetworkTasks in his onPostExecute() method must call UpdateCurrentActivityAfterNetworkOperation() which is defined in BaseActivity class but BaseActivity class also have to create an instance of RestfulNetworkTasks . 在其onPostExecute()方法中名为RestfulNetworkTasks AsyncTask类必须调用在BaseActivity类中定义的UpdateCurrentActivityAfterNetworkOperation() ,但BaseActivity类还必须创建RestfulNetworkTasks的实例。 Here is code which illustrates this problem clearly. 这是清楚说明此问题的代码。

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();
    }
}

As you see i have a circular dependency here between RestfulNetworkTasks and BaseActivity classes which may cause infinite chain calls of constructors. 如您所见,我在RestfulNetworkTasks和BaseActivity类之间具有循环依赖关系,这可能会导致构造函数的无限链调用。

The question how can I refactor this design to avoid this? 问题是如何重构该设计以避免这种情况?

The AsyncTask will amost always be called from an Activity, so why not just pass it in as a Constructor argument? AsyncTask几乎总是从Activity调用,那么为什么不仅仅将其作为构造函数参数传入呢?

RestfulNetworkTasks.java: RestfulNetworkTasks.java:

private BaseActivity activity;

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

BaseActivity.java: BaseActivity.java:

new RestfulNetworkTasks(this).execute();

You should not create Activity that way 您不应该这样创建活动

BaseActivity instance_Activity = new BaseActivity();

Activities are managed by system 活动由系统管理

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM