0

クライアント (アンドロイド)/サーバー (Java) アプリケーションを作成しています。サーバーは、クライアントからのリクエストごとに true または「false とエラー コード」を返します。クライアント側のstrings.xmlにすべてのエラーメッセージ(文字列)を追加しました。

これがエラーコードを保持する方法です。

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));
...

このプロセスを簡単にする方法は 2 つありますが、どちらもエレガントではありません。

アプローチ 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));

私が考えられないより良い方法があると思います。どちらの方法も痛々しく聞こえるからです。このような状況をどのように処理しますか?

4

3 に答える 3

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 ファイルにすべてのサーバー エラー識別子に対応するエントリがあるかどうかを確認するスクリプトを作成することもできます。

于 2013-04-15T21:45:40.963 に答える