0

2 つのクラスがあります。1 つはBaseActivity(アプリ内のすべてのアクティビティのグローバルな親) を定義し、もう 1 つはAsyncTask一般的なネットワーク操作を定義したクラスです。しかし、次の問題があります。彼のメソッドで指定されたAsyncTaskクラスは、クラスで定義されたものを呼び出す必要がありますが、クラスは のインスタンスも作成する必要があります。この問題を明確に示すコードを次に示します。RestfulNetworkTasksonPostExecute()UpdateCurrentActivityAfterNetworkOperation()BaseActivityBaseActivityRestfulNetworkTasks

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 クラスの間に循環依存関係があり、コンストラクターの無限チェーン呼び出しが発生する可能性があります。

これを回避するために、この設計をどのようにリファクタリングできますか?

4

2 に答える 2

3

AsyncTask は、ほとんどの場合、アクティビティから呼び出されるため、コンストラクターの引数として渡さないのはなぜでしょうか?

RestfulNetworkTasks.java:

private BaseActivity activity;

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

BaseActivity.java:

new RestfulNetworkTasks(this).execute();
于 2013-02-22T09:26:33.760 に答える
1

そのようにアクティビティを作成しないでください

BaseActivity instance_Activity = new BaseActivity();

活動はシステムで管理

于 2013-02-22T08:59:19.307 に答える