2013-04-15 1 views
0

Я пишу приложение клиента (android)/server (java). Сервер возвращает true или «false и код ошибки» для каждого запроса, сделанного клиентом. Я добавил каждое сообщение об ошибке (string) в strings.xml на стороне клиента.Как делиться идентификаторами ресурсов между клиентом и сервером в Android?

Вот как я держу коды ошибок;

public class ErrorCodes { 
    public static final int WRONG_USERNAME = 1; 
    public static final int WRONG_PASSWORD = 2; 
    public static final int WRONG_EMAIL= 3; 
    ... 
} 

Проблема в том, что каждый раз сервер отправляет код ошибки, я должен обрабатывать его примерно так (примерно);

int code = conn.receive(); 
if(code == ErrorCodes.WRONG_USERNAME) 
    print(getResources().getString(R.string.WRONG_USERNAME_ERROR)); 
else if(code == ErrorCodes.WRONG_PASSWORD) 
    print(getResources().getString(R.string.WRONG_PASSWORD_ERROR)); 
... 

Есть два подхода в моем сознании, чтобы облегчить этот процесс, но оба они не изящны.

Подход 1: Выполнение значений ErrorCodes, равное значениям R.string вручную. Также с этим подходом мне не нужно сохранять класс ErrorCodes на стороне клиента.

Проблема: Мне нужно обновлять оба ErrorCodes и strings.xml каждый раз, когда добавляю новое сообщение об ошибке.

Подход 2: Использовать сгенерированный файл R.java на сервере, не нужно ничего обновлять. Это лучшее, что я могу придумать.

Задача (и): Будет много ненужного материала с R.java. Я должен использовать его так, как на стороне сервера: R.string.xyz. И если сервер не закодирован с помощью java, весь подход бесполезен.

Если я использую один из них, я могу сделать это на стороне клиента;

int code = conn.receive(); 
print(getResources().getString(code)); 

Я думаю, что есть лучший способ, о котором я не могу думать. Потому что оба пути звучат больно. Как справиться с такой ситуацией?

ответ

1

Я предлагаю сохранить ваш подход. Это приведет вас написать код для обработки всех случаев, но в конце концов, для меня, является наиболее надежным решением, потому что:

  1. Ваш сервер не будет Android зависит. Логика вашего сервера будет действительна только для Android. В случае, если завтра вы разработаете одного клиента для другой платформы, было бы намного лучше иметь платформенный независимый протокол.
  2. Каждый раз, когда вы редактируете свое приложение, добавляете новые ресурсы и т. Д., Ваш R-файл генерируется снова, а R.string.something может иметь другое значение, чем предыдущая сборка. Таким образом, в ситуации, когда вы развертываете обновление приложения, ваши пользователи могут испытывать странные ошибки, потому что в версии 1 вашего приложения ресурс 12345 может указывать на R.string.something, а в версии 2 может указывать на R.string.something_else. Но, возможно, для этого момента существует метод сохранения статического значения R.string.

следующее решение представляется приемлемым для меня:

Ваш сервер возвращает код для ваших ошибок, например:

1 for WRONG_USERNAME 
2 for WRONG_PASSWORD 
3 for WRONG_EMAIL 

вы можете объявить строку этот путь:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string name="error_1">Wrong username!</string> 
    <string name="error_2">Wrong password!</string> 
    <string name="error_3">Wrong email!</string> 
</resources> 

И затем вы загружаете ресурс строки по имени:

int stringId = getResources().getIdentifier("error_"+errorCode,"string",getPackageName()); 
+0

Вы правы в отношении зависимости от сервера, это была моя ошибка, чтобы даже подумать об этом. Я решил использовать подобный метод для того, что вы предложили. Я использовал объект Hashtable; 'errors.put (ErrorCode, R.string.ERROR_WRONG_USERNAME)'. Спасибо. –

0

Я использую тот же метод, описанный в подходе 1

Если вы хотите напечатать ошибки, подумайте об использовании JSON для передачи данных из Серуэра, например:

if(logged_on == true){ 
    server.send("{\"status\":0}"); 
}else{ 
    server.send("{\"status\":1,\"error\":"+ErrorString); 
} 

Тогда на стороне клиента проверьте поле состояния и если равно 1 строка печати из поля ошибки.

0

Лучшее решение, очевидно, должно содержать строки описания ошибок на сервере, но это может создать дополнительную сложность для локализации. Вам нужно будет отправить текущий язык интерфейса устройства на сервер, чтобы получить правильное описание ошибки.

В противном случае я бы использовал короткие текстовые идентификаторы ошибок на стороне сервера (например, «no_data_found», «db_timeout» и т. Д.) - что-то, что имеет смысл и упрощает отладку и изменение таблицы строк для приложения для Android.
На стороне клиента я бы добавил соответствующие строки описания ошибок, с идентификаторами, следуя некоторой стандартной схеме. Например: «error_no_data_found», «error_db_timeout».
Затем, чтобы получить строку описания ошибки, вы можете использовать отражение:

String getErrorString(String stringName) 
{ 
    try 
    { 
     Field f_a =R.string.class.getDeclaredField(stringName); 
     int a = f_a.getInt(null); 
     return getString(a); 
    } 
    catch (NoSuchFieldException x) 
    { 
     return "No error description for "+stringName; 
    } 
    catch (IllegalAccessException x) 
    { 
     return ""; 
    }  
} 

... 
String errorDescription = getErrorString("error_"+errorCodeReceivedFromServer); 

Кроме того, вы можете написать скрипт, чтобы проверить, если все идентификаторы ошибок сервера имеют соответствующие записи в strings.xml файл.

Смежные вопросы