2015-03-25 74 views
7

現在我已經擺弄了幾天。無法做到。 Android工作室不會讓我編譯這個錯誤。所以,我有這個應用程序,我有兩個選項卡和兩個片段。一個片段被稱爲new,並且該片段獲取json。但我無法做到這一點。我上傳了一張關於錯誤的樣子和類文件的圖片。你能幫我解決嗎?爲什麼我的JsonObjectRequest不工作​​?

錯誤:「無法解析構造JsonObjectRequest(INT,java.lang.String中,空.......)

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

你爲什麼不告訴我們錯誤信息說什麼? – immibis 2015-03-25 04:38:27

+0

我認爲JsonObjectRequest()參數與輸入的參數不相符。請檢查參數。 – 2015-03-25 05:11:43

回答

24

cast(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需要第三個參數作爲String requestBody

cast null to String

,或者你可以像String rBody = null;,然後一個空字符串傳遞rBody爲第三個參數

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我有同樣的問題。而解決方案你解決了。我們爲什麼要這樣做?你能解釋一下嗎?和/或爲什麼我們需要投射到字符串? – 2015-06-23 07:22:08

+0

@KarthikeyanVe我發現[這篇文章](http://stackoverflow.com/questions/315846/why-null-cast)有關同樣的。它討論'varargs'功能。我會做更多的搜索 – 2015-06-23 08:26:17

3

好了,我看到的情況,它發生的原因是因爲你的錯誤說,構造函數不存在。

如果您使用的是JsonObjectRequest爲默認值,並且要消耗的Get方法,你不必發送空參數,你就應該把這種方式:

更改此:

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

對於這一點:

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

正如你所看到的,我只是刪除了的JSONObject的參數,因爲該方法獲取,並且有一個構造函數這就是接受日在你不發送JsonObject。

另一種解決方案是製作自己的JsonObjectRequest,並將其自定義爲接受這種類型的值。

問候。

+0

我刪除了null,它工作。謝謝。不知道爲什麼,但我正在閱讀的教程有第三個參數爲null。 – 2015-09-06 14:38:12

0

有一種曖昧的構造,爲解決此問題,使用此代碼:

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

對於大家想現在落實這一權利:谷歌改變了jsonObjectRequest構造函數:現在你沒有,聲訊請求類型了,而是如果您需要獲取請求,則首先提供url,然後再提供null作爲第二個參數。例如:

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

問題與排球的版本有關。 在你的構建。gradle應用程序文件,你應該有

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