Это слишком долго для комментария, поэтому я пишу ответ. Однако это был совет @Pompe de velo, который заставил меня пойти по этому пути, поэтому я принимаю этот ответ. Я также пропустил некоторую информацию из моего вопроса, которая могла бы быть полезной.
Во всяком случае, на данный момент я не вижу каких-либо серьезных недостатков в этом подходе, но время (или, возможно, другой пользователь SO;]) покажет ...
По сути, я назначил константу для каждого типа объекта, который будет пытаться получить действие. Часть, которую я пропустил, заключалась в том, что сервер возвращает объект ошибки только с кодом состояния 4xx-5xx http. Другими словами, я уверен, что получу ожидаемый объект или объект ошибки, и я могу определить, что я получил из кода состояния. Затем switch
отправляет фактическую строку json соответствующему методу, который может манипулировать ответом по мере необходимости.
Упрощенный псевдокод ...
private void getGameData(){
new MyAsyncTask(this, MyAsyncTask.OBJ_GAME_DATA).execute();
}
static class MyAsyncTask extends AsyncTask<String, Integer, String> {
private int outputObjectType;
protected static final int OBJ_GAME_DATA = 0;
protected static final int OBJ_OTHER_DATA = 1;
protected static final int OBJ_DIFFERENT_DATA = 2;
protected static final int OBJ_SERVER_ERROR = 3;
MyAsyncTask(MyActivity activity, int expectedObject){
outputObjectType = expectedObject;
}
doInBackground(){
if(httpStatusCode >= 400){
outputObjectType = MyAsyncTask.OBJ_SERVER_ERROR;
}
return jsonStringFromServer;
}
onPostExecute(String json){
switch(outputObjectType){
case MyAsyncTask.OBJ_SERVER_ERROR:
serverError(json);
break;
case MyAsyncTask.OBJ_GAME_DATA:
processGameData(json);
break;
// ....
}
}
}
private void serverError(String json){
ServerError se = new Gson().fromJson(json, ServerError.class);
Log.d(TAG, se.getErrorMessage());
}
private void processGameData(String json){
GameData gd = new Gson().fromJson(json, GameData.class);
// .......
}
Я думаю, что это гораздо меньше того, что говорил @Pompe de velo, однако я просто делаю свой a_parameter_match
на основе кода состояния, а не чего-то внутри json.
Если это ошибочно, я хотел бы узнать, почему!