处理错误和成功消息的最佳方法是从后端复制文本?

时间:2017-11-15 07:22:55

标签: java android dynamic server

我有一个Android应用程序,现在我在strings.xml资源文件中管理错误和成功消息。现在,如果我想要更改这些消息,我需要在strings.xml文件中进行更改,并在play-store中提供应用程序更新,这有点开销。相反,我希望从服务器端(后端)管理这些消息,以便可以在不进行任何更新的情况下更改它们。任何人都可以建议我实现这一目标的最佳方法。

1 个答案:

答案 0 :(得分:0)

如果您使用的是Volley,那么这对您来说很有帮助

VolleyError实际上只是一个扩展的Exception,因此Exception.getMessage()可能不会返回您要查找的内容,除非您在扩展的Request类中覆盖解析VolleyError的解析方法。处理此问题的一个基本方法是执行以下操作:

//In your extended request class
@Override
protected VolleyError parseNetworkError(VolleyError volleyError){
        if(volleyError.networkResponse != null && volleyError.networkResponse.data != null){
                VolleyError error = new VolleyError(new String(volleyError.networkResponse.data));
                volleyError = error;
            }

        return volleyError;
    }
}

如果将此添加到扩展的Request类中,则getMessage()至少应该不返回null。不过,我通常不会为此烦恼,因为从onErrorResponse(VolleyError e)方法中可以轻松完成所有操作。

你应该使用JSON库来简化事情 - 例如我使用Gson,或者你可以使用Apache的JSONObjects,它不需要额外的外部库。第一步是将从服务器发送的响应JSON作为String(以与我刚才演示的方式类似的方式),然后您可以选择将其转换为JSONObject(使用apache的JSONObjects和JsonArrays,或者您选择的另一个库)或者只是自己解析String。之后,您只需要显示Toast。

这里有一些示例代码可以帮助您入门:

public void onErrorResponse(VolleyError error) {
     String json = null;

     NetworkResponse response = error.networkResponse;
     if(response != null && response.data != null){
         switch(response.statusCode){
             case 400:
                  json = new String(response.data);
                  json = trimMessage(json, "message");
                  if(json != null) displayMessage(json);
                  break;
             }
            //Additional cases
     }
}

public String trimMessage(String json, String key){
    String trimmedString = null;

    try{
        JSONObject obj = new JSONObject(json);
        trimmedString = obj.getString(key);
    } catch(JSONException e){
        e.printStackTrace();
        return null;
    }

    return trimmedString;
}

//Somewhere that has access to a context
public void displayMessage(String toastString){
    Toast.makeText(context, toastString, Toast.LENGTH_LONG).show();
}