またしてもVolleyネタです。今回は通常処理でなくエラーハンドリングの処理の場合を扱います。
環境
- rails4.1.2 and grape
- android:minSdkVersion="14"
- android:targetSdkVersion="19"
ステータスコードを受け取る
volleyは、40Xや50Xのstatus codeを受け取ると、VolleyErrorを受け取るような仕様になっています。
サーバーAPIを使ったandroidの処理では、volleyとrails4.1.2 and grapeの組み合わせでjsonを使うのが一番早く作成できると思います(ただし、学習コストは高めかも)。
//レスポンス失敗時のリスナー
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
executeVolleyError(error);
}
}){
上記ではexecuteVolleyErrorというメソッドを呼び出しています。これはFragmentの共通処理クラス(親クラス)に記述しています。
executeVolleyErrorメソッド
/**
* Get Volley Error
* @param error
*/
protected void executeVolleyError(VolleyError error) {
if (BuildConfig.DEBUG) {
Log.d(TAG, "error : " + error.getMessage());
Log.d(TAG, "Status code : " + error.networkResponse.statusCode);
}
if (error != null) {
if (error.networkResponse == null) {
Toast toast = Toast.makeText(getActivity().getApplicationContext(), getActivity().getApplicationContext().getResources().getString(R.string.network_error_404), Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
return;
}
// status code 400, status code 404
if (HttpStatus.SC_BAD_REQUEST == error.networkResponse.statusCode || HttpStatus.SC_NOT_FOUND == error.networkResponse.statusCode) {
Toast toast = Toast.makeText(getActivity().getApplicationContext(), getActivity().getApplicationContext().getResources().getString(R.string.network_error_404), Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
// status code 503
} else if (HttpStatus.SC_SERVICE_UNAVAILABLE == error.networkResponse.statusCode) {
Intent intent = new Intent(getActivity(), MaintenanceActivity.class);
startActivity(intent);
return;
}
}
}
status codeが400(パラメーターエラー)と404(ページエラー)の場合は、エラーメッセージをToastで表示しています。
status codeが503の場合はメンテナンス画面に遷移させています。
当然ですが、各acticityやfragmentにゴリゴリとコピーするのはNGなので共通処理としてまとめましょう。
参考までにrails and grape(サーバーAPI)側のコードを以下に記載します。
resource 'tests' do
get '/' do
return error!(Test.maintenanceJson, 503) if Test.isMaintenance?(params)
return error!(Test.testParamError, 400) unless Test.checkParameter(params)
tests = Test.tests(params)
return Test.testJson(tests, params)
end
end
以上
0 件のコメント:
コメントを投稿