2015-03-25 19 views
7

Ich habe jetzt seit ein paar Tagen mit diesem fummelt. Konnte es nicht richtig machen. Android Studio lässt mich nicht mit diesem Fehler kompilieren. Also, ich habe diese Anwendung, wo ich zwei Tabs und zwei Fragmente habe. Ein Fragment wird als neu bezeichnet, und dieses Fragment ruft json ab. Aber ich konnte es nicht richtig machen. Ich habe ein Bild hochgeladen, wie der Fehler aussieht, und die Klassendateien. Kannst du mir bitte helfen?Warum funktioniert mein JsonObjectRequest nicht?

Fehler: „Kann nicht Konstruktor JsonObjectRequest lösen (int, java.lang.String, null .......)

The error

new_fragment.java

public class new_fragment extends Fragment { 
    private static final String ARG_PARAM1 = "param1"; 
    private static final String ARG_PARAM2 = "param2"; 

    private String mParam1; 
    private String mParam2; 
    private VolleySingleton volleySingleton; 
    private ImageLoader imageLoader; 
    private RequestQueue requestQueue; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() !=null){ 
      mParam1 = getArguments().getString(ARG_PARAM1); 
      mParam2 = getArguments().getString(ARG_PARAM2); 
     } 
     volleySingleton = VolleySingleton.getsInstance(); 
     requestQueue = volleySingleton.getRequestQueue(); 
     RequestQueue requestQueue = VolleySingleton.getsInstance().getRequestQueue(); 
     JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET,"http://10.0.8.152/json/new.json",null, 
       new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject response) { 
         System.out.println(response); 
        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 

        } 
       }); 
     requestQueue.add(request); 
    } 

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedIntanceState) { 
     setHasOptionsMenu(true); 
     View layout = inflater.inflate(R.layout.new_fragment, container, false); 
     return layout; 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     // TODO Auto-generated method stub 
     super.onCreateOptionsMenu(menu, inflater); 
     inflater.inflate(R.menu.ref_menu, menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // handle item selection 
     switch (item.getItemId()) { 
      case R.id.refreshico: 
       // do s.th. 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

} 

VolleySingleton

public class VolleySingleton { 
    private static VolleySingleton sInstance = null; 
    private ImageLoader mImageLoader; 
    private RequestQueue mRequestQueue; 
    private VolleySingleton(){ 
     mRequestQueue = Volley.newRequestQueue(appClass.getAppContext()); 
     mImageLoader = new ImageLoader(mRequestQueue,new ImageLoader.ImageCache() { 
      private LruCache<String, Bitmap> cache = new LruCache<>((int)(Runtime.getRuntime().maxMemory()/1024)/8); 

      @Override 
      public Bitmap getBitmap(String url) { 
       return cache.get(url); 
      } 

      @Override 
      public void putBitmap(String url, Bitmap bitmap) { 
       cache.put(url, bitmap); 
      } 
     }); 
    } 

    public static VolleySingleton getsInstance(){ 
     if(sInstance==null){ 
      sInstance = new VolleySingleton(); 
     } 
     return sInstance; 
    } 

    public RequestQueue getRequestQueue(){ 
     return mRequestQueue; 
    } 
    public ImageLoader getImageLoader(){ 
     return mImageLoader; 
    } 


} 
+1

Warum haben Sie uns nicht gesagt, was die Fehlermeldung sagt? – immibis

+0

Ich denke, dass der JsonObjectRequest() - Parameter nicht mit dem eingegebenen Parameter übereinstimmt. Bitte überprüfen Sie den Parameter. –

Antwort

24

Besetzung (String) null

JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET,"http://10.0.8.152/json/new.json",(String)null, 
       new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject response) { 
         System.out.println(response); 
        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 

        } 
       }); 
9

new JsonObjectRequest nimmt dritten Parameter als String requestBody

cast null to String

oder Sie können eine leere Zeichenfolge wie String rBody = null; machen und dann rBody als dritter Parameter übergeben

JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, 
       "http://10.0.8.152/json/new.json", (String) null, // here 
       new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject response) { 
         System.out.println(response); 
        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 

        } 
       }); 
requestQueue.add(request); 
+0

@rogertthatcode Ich hatte das gleiche Problem. Und die Lösung, die du gegeben hast, ist gelöst. Warum sollten wir so etwas geben? Könnten Sie bitte erklären. Und/Oder warum wir nach String werfen müssen? –

+0

@KarthikeyanVe ich fand [diesen Beitrag] (http://Stackoverflow.com/questions/315846/why-null-cast) hilfreich in Bezug auf die gleichen. Es spricht von 'varargs' Funktion. Ich werde noch mehr suchen, auch –

3

Nun, ich, die Situation zu sehen, und Es ist passiert, weil der Konstruktor, wie der Fehler sagt, nicht existiert.

Wenn Sie die JsonObjectRequest als Standard verwenden, und Sie wollen eine Get-Methode zu konsumieren, müssen Sie nicht die Null-Parameter senden müssen, sollten Sie nur diese Art und Weise senden:

ändern diese:

JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET,"http://10.0.8.152/json/new.json",null, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        System.out.println(response); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 

       } 
      }); 
    requestQueue.add(request); 

Dazu:

JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET,"http://10.0.8.152/json/new.json", 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        System.out.println(response); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 

       } 
      }); 
    requestQueue.add(request); 

Wie Sie sehen können, ich entfernen Sie einfach den Parameter für die JsonObject, weil die Methode ist importieren, und es ist ein Konstruktor, das ist th akzeptieren Sie schicken JsonObject nicht.

Eine andere Lösung besteht darin, ein eigenes JsonObjectRequest zu erstellen und diese Art von Werten zu akzeptieren.

Grüße.

+0

Ich entfernte null und es hat funktioniert. Vielen Dank. Nicht sicher, warum, aber ein Tutorial, das ich las, hatte null als dritten Parameter. –

0

Es ist eine zweideutige Constructor, für dieses Problem lösen, diesen Code zu verwenden:

JSONObject jsonObject = null; 

    JsonObjectRequest request = new JsonObjectRequest(
      Request.Method.GET, "Your url", jsonObject, 
      new Response.Listener<JSONObject>() { 

       @Override 
       public void onResponse(JSONObject response) { 

       } 
      }, 
      new Response.ErrorListener() { 

       @Override 
       public void onErrorResponse(VolleyError error) { 

       } 
     }); 
1

Für alle versuchen, dieses Recht zu implementieren jetzt: geändert Google den jsonObjectRequest Konstruktor: jetzt Sie suppy nicht die Anforderung geben mehr Stattdessen liefern Sie zuerst die URL und dann null als zweiten Parameter, wenn Sie eine Anfrage erhalten möchten. Beispiel:

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://www.aaa.com/getJSON/dummyMeldung.json", null, 
       new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject response) { 
         try { 
          JSONArray jsonArray = response.getJSONArray("meldung"); 
          for (int i = 0; i <= jsonArray.length(); i++) { 
           JSONObject meldung = jsonArray.getJSONObject(i); 
           String comment = meldung.getString("comment"); 
           Log.d("ausgabe", comment); 
          } 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 

        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 

        } 
       }); 
0

Das Problem, mit der Version von Volley zu tun. Auf Ihrem Build.Gradle App-Datei sollten Sie haben

dependencies { 
...... 
compile 'com.mcxiaoke.volley:library:1.0.0' 
..... 
} 
Verwandte Themen