2014年10月13日月曜日

android Volleyを使ったエラーハンドリング rails grapeとの連携

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

コメントを投稿

Related Posts Plugin for WordPress, Blogger...