2016-09-15 4 views
2

У меня есть общий метод sendRequest(), который я использую для получения результата json с сервера. Я разбираю результат в экземпляре обратного вызова прямо сейчас, но вместо этого я бы скорее просто передал тип методу sendRequest(), чтобы я мог анализировать и обрабатывать исключения перед обратным вызовом. Как я могу это сделать? Я включил соответствующий код и некоторые комментарии ниже.Создание общего класса и параметра в Java

public void sendRequest(int method, String url, final RequestListener listener) { 
    StringRequest postRequest = new StringRequest(method, url, 
      new Response.Listener<String>() 
      { 
       @Override 
       public void onResponse(String response) { 
        listener.gotResponse(response, null); 

        // Instead of parsing this into a user object, I'd like to parse it into 
        // a type that I pass into the sendRequest() method. 
        try { 
         User user = User.parseJson(new JSONObject(response)); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 

ответ

2

Прежде всего обратите внимание, что из коробки вы имеете JsonObjectRequest, который преобразует ответ непосредственно в JSONObject, который, кажется, лучше, чем StringRequest в вашем случае, но, как вы хотите пойти немного дальше, я хотел бы предложить для создания custom request на основе универсального unmarshaller.

public interface JsonUnmarshaller<T> { 
    T parse(JSONObject object) throws JSONException; 
} 

Запрос на заказ может быть что-то вроде этого:

public class JSONRequest extends Request<T> { 
    private final Listener<T> mListener; 
    private final JsonUnmarshaller<T> unmarshaller; 

    public JSONRequest(int method, String url, Listener<T> listener, 
     ErrorListener errorListener, JsonUnmarshaller<T> unmarshaller) { 
     super(method, url, errorListener); 
     mListener = listener; 
     this.unmarshaller = unmarshaller; 
    } 

    @Override 
    protected void deliverResponse(T response) { 
     mListener.onResponse(response); 
    } 
    @Override 
    protected Response<T> parseNetworkResponse(NetworkResponse response) { 
     String parsed; 
     try { 
      parsed = new String(
       response.data, HttpHeaderParser.parseCharset(response.headers) 
      ); 
     } catch (UnsupportedEncodingException e) { 
      parsed = new String(response.data); 
     } 
     try { 
      return Response.success(
       unmarshaller.parse(new JSONObject(parsed)), 
       HttpHeaderParser.parseCacheHeaders(response) 
      ); 
     } catch (JSONException je) { 
      return Response.error(new ParseError(je)); 
     } 
    } 
} 

Тогда ваш метод будет:

public <T> void sendRequest(int method, String url, final RequestListener 
          listener, JsonUnmarshaller<T> unmarshaller) { 
    JSONRequest postRequest = new JSONRequest(... 
+0

Я чувствую себя глупо за то, что не прочитал документы, пример, который у них был на этой странице, был именно тем, что я искал. Благодаря! – jwBurnside

0

написал кое-что для вас здесь, я думаю, вы будете в состоянии применить это к вашему примеру:

import java.util.*; 
public class Cat{ 
    public static void main(String... args){ 
     Cat cat = new Cat(); 
     cat.send(Dog.class); 
     cat.send(Mouse.class); 
    } 

    public <T extends Parseable> void send(Class<T> clazz){ 
     try{ 
      T t = clazz.newInstance(); 
      t.parse(); 
     } catch(Exception e){ 

     } 
    } 
} 

interface Parseable{ 
    void parse(); 
} 

class Dog implements Parseable{ 
    public void parse(){ 
     System.out.println("Dog parse"); 
    } 
} 

class Mouse implements Parseable{ 
    public void parse(){ 
     System.out.println("Mouse parse"); 
    } 
} 

Ваш метод является статическим, так что вы, вероятно, можете просто сделать T.parseJson(). Не уверен, что не будет никаких проблем с передачей родового типа анонимному слушателю, но я надеюсь, что он сработает.

+0

Классные спасибо я буду проверять его. – jwBurnside

Смежные вопросы