またしても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 件のコメント:
コメントを投稿