簡體   English   中英

如何避免兩個類之間的循環依賴?

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

我有兩個類-一個定義BaseActivity (應用程序中所有活動的全局父類),另一個是AsyncTask類,在其中定義了通用的網絡操作。 但是我有下一個問題。 在其onPostExecute()方法中名為RestfulNetworkTasks AsyncTask類必須調用在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類之間具有循環依賴關系,這可能會導致構造函數的無限鏈調用。

問題是如何重構該設計以避免這種情況?

AsyncTask幾乎總是從Activity調用,那么為什么不僅僅將其作為構造函數參數傳入呢?

RestfulNetworkTasks.java:

private BaseActivity activity;

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

BaseActivity.java:

new RestfulNetworkTasks(this).execute();

您不應該這樣創建活動

BaseActivity instance_Activity = new BaseActivity();

活動由系統管理

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM