【问题标题】:how to access restful web service methods using volley library如何使用 volley 库访问 RESTful Web 服务方法
【发布时间】:2015-10-21 08:16:30
【问题描述】:

我使用本教程 http://www.tutecentral.com/restful-api-for-android-part-1/ 创建了一个安静的 Web 服务,运行后我得到了一个自动生成的 java 文件,其中包含以下代码。

public class RestAPI {

    private final String urlString = "http://125.0.0.174/Handler1.ashx"; 
    private static String convertStreamToUTF8String(InputStream stream) throws IOException {
    String result = "";
    StringBuilder sb = new StringBuilder();
    try {
        InputStreamReader reader = new InputStreamReader(stream, "UTF-8");
        char[] buffer = new char[4096];
        int readedChars = 0;
        while (readedChars != -1) {
            readedChars = reader.read(buffer);
            if (readedChars > 0)
               sb.append(buffer, 0, readedChars);
        }
        result = sb.toString();
    } catch (UnsupportedEncodingException e){
        e.printStackTrace();
    }
    return result;
}

private String load(String contents) throws IOException {
    URL url = new URL(urlString);
    HttpURLConnection conn = (HttpURLConnection)url.openConnection();
    conn.setRequestMethod("POST");
    conn.setConnectTimeout(60000);
    Log.e("load r2","load r2");
    conn.setDoOutput(true);
    conn.setDoInput(true);
    OutputStreamWriter w = new OutputStreamWriter(conn.getOutputStream());
    w.write(contents);
    w.flush();
    InputStream istream = conn.getInputStream();
    String result = convertStreamToUTF8String(istream);
    return result;
}

private Object mapObject(Object o) {
    Object finalValue = null;
    if (o.getClass() == String.class) {
        finalValue = o;
    }
    else if (Number.class.isInstance(o)) {
        finalValue = String.valueOf(o);
    } else if (Date.class.isInstance(o)) {
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss", new Locale("en", "USA"));
        finalValue = sdf.format((Date)o);
    }
    else if (Collection.class.isInstance(o)) {
        Collection<?> col = (Collection<?>) o;
        JSONArray jarray = new JSONArray();
        for (Object item : col) {
            jarray.put(mapObject(item));
        }
        finalValue = jarray;
    } else {
        Map<String, Object> map = new HashMap<String, Object>();
        Method[] methods = o.getClass().getMethods();
        for (Method method : methods) {
            if (method.getDeclaringClass() == o.getClass()
                    && method.getModifiers() == Modifier.PUBLIC
                    && method.getName().startsWith("get")) {
                String key = method.getName().substring(3);
                try {
                    Object obj = method.invoke(o, null);
                    Object value = mapObject(obj);
                    map.put(key, value);
                    finalValue = new JSONObject(map);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
    return finalValue;
}

public JSONObject GetDoctors(String Terr_Code) throws Exception {
    JSONObject result = null;
    JSONObject o = new JSONObject();
    JSONObject p = new JSONObject();
    o.put("interface","RestAPI");
    o.put("method", "GetDoctors");
    p.put("Terr_Code",mapObject(Terr_Code));
    o.put("parameters", p);
    String s = o.toString();
    String r = load(s);
    result = new JSONObject(r);
    return result;
}

public JSONObject GetUserDetail(String IMEINO) throws Exception {
    JSONObject result = null;
    JSONObject o = new JSONObject();
    JSONObject p = new JSONObject();
    o.put("interface","RestAPI");
    o.put("method", "GetUserDetail");
    p.put("IMEINO",mapObject(IMEINO));
    o.put("parameters", p);
    String s = o.toString();
    String r = load(s);
    result = new JSONObject(r);
    return result;
}
}

我在异步任务中调用这个类,一切正常,但我想通过 volley 使用它,因为异步任务很慢。 这个类只有一个 url 我不明白如何为个别方法调用这个 url 我尝试了下面的代码,但我得到了错误的 url 异常。请告诉我如何使用单独的 url 访问 rest api 的方法。

public void requestJSON() {

          String tag_json_obj = "json_obj_req";

          final ProgressDialog pDialog = new ProgressDialog(context);
          pDialog.setMessage("Loading...");
          pDialog.show();
          JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.GET, null,
                null, new Response.Listener<JSONObject>() {

                   @Override
                   public void onResponse(JSONObject response) {
                        try {
                             RestAPI restAPI = new RestAPI(); 
                             response = restAPI.GetDoctors(terrcode);                            
                        }   
                        catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                 display.setText(response.toString());

                      pDialog.hide();
                   }

              }, new Response.ErrorListener() {

                   @Override
                   public void onErrorResponse(VolleyError error) {
                      display.setText(error.toString());
                      pDialog.hide();
                   }
                });

          // Adding request to request queue
          VolleySingleton.getInstance().addToRequestQueue(jsonObjReq,
                tag_json_obj);
       }

【问题讨论】:

    标签: java android rest android-volley


    【解决方案1】:

    使用 Volley 作为 VolleyService :

    public class VolleyService {
    
        private static VolleyService instance;
        private RequestQueue requestQueue;
        private ImageLoader imageLoader;
    
        private VolleyService(Context context) {
            requestQueue = Volley.newRequestQueue(context);
    
            imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
                private final LruCache<String, Bitmap> cache = new LruCache<String, Bitmap>(20);
    
                @Override
                public Bitmap getBitmap(String url) {
                    return cache.get(url);
                }
    
                @Override
                public void putBitmap(String url, Bitmap bitmap) {
                    cache.put(url,bitmap);
                }
            });
        }
    
        public static VolleyService getInstance(Context context) {
            if (instance == null) {
                synchronized(VolleyService.class) {
                    if (instance == null) {
                        instance = new VolleyService(context);
                    }
                }
            }
            return instance;
        }
    
        public RequestQueue getRequestQueue() {
            return requestQueue;
        }
    
        public ImageLoader getImageLoader() {
            return imageLoader;
        }
    }
    

    然后在 Activity 或 Fragment 中使用您的 VolleyService :

    RequestQueue queue = VolleyService.getInstance(this.getContext()).getRequestQueue();
    StringRequest request = new StringRequest(url, new Response.Listener<String>() {    
                    @Override
                    public void onResponse(String response) {
                        // we got the response, now our job is to handle it
                        try {
    //Here you parse your JSON - best approach is to use GSON for deserialization
                            getJsonFromResponse(response);
                        } catch (RemoteException | OperationApplicationException e) {
                            e.printStackTrace();
                        }
                    }
                }, new Response.ErrorListener() {
    
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        //something happened, treat the error.
                        Log.e("Error", error.toString());
                    }
                });
    
                queue.add(request);
    

    【讨论】:

    • 您可以使用Response 类中的parseNetworkResponse 方法来解析您的对象,这样您就不会真正在UI 线程上进行解析。
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 2019-05-28
    • 2018-01-30
    相关资源
    最近更新 更多