2015-03-25 11 views
7

Od paru dni bawiam się z tym. Nie można tego naprawić. Android Studio nie pozwoli mi skompilować go z tym błędem. Tak więc mam tę aplikację, w której mam dwie karty i dwa fragmenty. Jeden fragment nazywa się nowym, a ten fragment wywołuje json. Ale nie mogłem zrobić tego poprawnie. Przesłałem obraz jak wygląda błąd i pliki klas. Czy możesz mi pomóc?Dlaczego mój JsonObjectRequest nie działa?

Błąd: „Nie można rozwiązać konstruktora JsonObjectRequest (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

Dlaczego nie powiedziałeś nam, co mówi komunikat o błędzie? – immibis

+0

Myślę, że parametr JsonObjectRequest() nie jest zgodny z wprowadzonym parametrem. Sprawdź parametr. –

Odpowiedz

24

obsada (ciąg) zerowy

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 zajmuje 3 parametr jako String requestBody

cast null to String

czy można zrobić łańcuch pusty jak String rBody = null; a następnie przekazać rBody jako 3. Parametr

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 Miałem ten sam problem. A rozwiązanie zostało rozwiązane. Dlaczego mielibyśmy tak dawać? Czy możesz wyjaśnić. I/lub dlaczego musimy rzucić na String? –

+0

@KarthikeyanVe znalazłem [ten post] (http://stackoverflow.com/questions/315846/why-null-cast) pomocne w odniesieniu do tego samego. Mówi o funkcji 'varargs'. Zrobię więcej wyszukiwania również –

3

Cóż, widzę sytuację i dzieje się tak, ponieważ jak twierdzi twój błąd, konstruktor nie istnieje.

Jeśli używasz JsonObjectRequest jako domyślne, a chcesz spożywać metody GET, nie trzeba wysłać pustego parametru, po prostu należy wysłać ten sposób:

to zmienić:

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); 

w tym:

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); 

Jak widać, po prostu usunąć parametr dla JSONObject, ponieważ metoda jest Get, a tam jest ów konstruktora zaakceptować th na ciebie nie wysyłaj JsonObject.

Innym rozwiązaniem jest utworzenie własnego JsonObjectRequest i dostosowanie go tak, aby akceptował takie wartości.

Pozdrawiam.

+0

Usunąłem null i zadziałało. Dzięki. Nie wiem, dlaczego, ale samouczek, który czytałem, miał trzeci parametr. –

0

Jest niejednoznaczne Konstruktor, dla rozwiązania tego problemu, należy użyć tego kodu:

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

Dla wszystkich, starając się realizować to teraz: Google zmieniło konstruktora jsonObjectRequest: teraz nie suppy żądanie wpisać więcej zamiast tego podajesz najpierw adres url, a następnie null jako drugi parametr, jeśli chcesz otrzymać żądanie pobrania. np .:

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

Problem związany z wersją siatkówki. Na Twojej kompilacji.plik aplikacyjny o gradacji powinien mieć

dependencies { 
...... 
compile 'com.mcxiaoke.volley:library:1.0.0' 
..... 
} 
Powiązane problemy