2 つのクラスがあります。1 つはBaseActivity
(アプリ内のすべてのアクティビティのグローバルな親) を定義し、もう 1 つはAsyncTask
一般的なネットワーク操作を定義したクラスです。しかし、次の問題があります。彼のメソッドで指定されたAsyncTask
クラスは、クラスで定義されたものを呼び出す必要がありますが、クラスは のインスタンスも作成する必要があります。この問題を明確に示すコードを次に示します。RestfulNetworkTasks
onPostExecute()
UpdateCurrentActivityAfterNetworkOperation()
BaseActivity
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 クラスの間に循環依存関係があり、コンストラクターの無限チェーン呼び出しが発生する可能性があります。
これを回避するために、この設計をどのようにリファクタリングできますか?