Androidアプリ開発 Volley JsonObjectRequestでcannot resolve constructor ... anonymousが発生する

2016年05月26日(編集2016年05月26日)
このエントリーをはてなブックマークに追加

VolleyはAndroid用のネットワークライブラリです。

この記事は、VolleyでJsonObjectRequestを利用した時に発生するエラーの解決方法を記載した記事です。

環境はAndroid 6.0 (API level 23) です。

環境

  • OS X Yosemite
  • Oracle jdk version 1.8.0_72
  • Android Studio 2.1.1
  • Volley 1.0.19

事象

Android Studio 2.1.1でVolleyをインストールし、Android Developer公式サイトのRequest JSONのコードを利用すると、

cannot resolve constructor 'JsonObjectRequest, ... anonymous ..'

という警告が発生してビルドに失敗します。

cannot resolve constructor 'JsonObjectRequest' ... anonymous ...

エラーの原因

JsonObjectRequestコンストラクタのオーバーロードに失敗している。

修正方法

利用しているJsonObjectRequestコンストラクタの引数は、(int method, String url, String requestBody, Listener listener, ErrorListener errorListener)です。

公式サイトでは第3引数にnullを設定していますが、これがエラーの原因です。この第3引数の値を

null → String

に変更することでビルドが通るようになります。

変更前(ビルド失敗)
{project_folder}/ui/MainFragment.java
String url = "http://localhost/dev/api/";
JsonObjectRequest jsObjRequest = new JsonObjectRequest
        (Request.Method.GET, url, null, new Response.Listener<JSONObject()> {

            @Override
            public void onResponse(JSONObject response) {
                String str = response.toString();
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                // TODO Auto-generated method stub

            }
        });
        
変更後(ビルドOK)
{project_folder}/ui/MainFragment.java
String url = "http://localhost/dev/api/";
+String requestBody = "";
JsonObjectRequest jsObjRequest = new JsonObjectRequest
        -(Request.Method.GET, url, null, new Response.Listener<JSONObject()> {
        +(Request.Method.GET, url, requestBody, new Response.Listener<JSONObject()> {

            @Override
            public void onResponse(JSONObject response) {
                String str = response.toString();
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                // TODO Auto-generated method stub

            }
        });
        

利用するAPIにパラメーターが不要な場合は、第3引数を削除しても大丈夫です。

{project_folder}/ui/MainFragment.java
String url = "http://localhost/dev/api/";
JsonObjectRequest jsObjRequest = new JsonObjectRequest
        -(Request.Method.GET, url, null, new Response.Listener<JSONObject()> {
        +(Request.Method.GET, url, new Response.Listener<JSONObject()> {

            @Override
            public void onResponse(JSONObject response) {
                String str = response.toString();
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                // TODO Auto-generated method stub

            }
        });
        

Rebuildをすれば、修正は完了です。

まとめ

Android開発では、公式サイトの情報でもバージョンアップで動作しなくなることがあります。
その時は、ライブラリのコードを読んで解決するのが一番です。

関連記事

タグ検索で調べてみよう

Android6.0 バグ修正 ライブラリ