Search code examples
javaandroidjsongsongeneric-method

Java passing className + object to generic method


In Android Java I want a MyDownloadHelper to download and return JSON data. This is working in two separate files with different class/object names. However, I can't get this to work dynamically.

With the current setup, I can call MySQLiteHelper.getRecipients(); in another activity and it will return the correct data. I am also using two classes (Pakbon, Recipient) for setting the correct data.

This is my current source:

public class MyDownloadHelper {

private static final int timeout = 10000;
private  Class<? extends Object[]> cls;
private static final String API_SERVER = "http://www.***.nl/json/";
private Object[] obj;

public MyDownloadHelper(){
}

protected Recipient[] getRecipients() {
    try {
        //Recipient[] recipients = getInstance(Recipient[].class);
        Recipient[] recipients   = this.download(Recipient[].class, API_SERVER + "getRecipients");
        return recipients;
    } finally {
        return null;
    }
}

protected Pakbon[] getPackingSlips() {
    try {
        Pakbon[] pakbon = this.download(Pakbon[].class, API_SERVER + "getPackingSlips");
        return pakbon;
    } finally {
        return null;
    }
}

private <T> Object[] download(Class<T> a, String url){
    HttpURLConnection c = null;

    try {
        URL u = new URL(url);
        c = (HttpURLConnection) u.openConnection();
        c.setRequestMethod("GET");
        c.setRequestProperty("Content-length", "0");
        c.setUseCaches(false);
        c.setAllowUserInteraction(false);
        c.setConnectTimeout(timeout);
        c.setReadTimeout(timeout);
        c.connect();
        int status = c.getResponseCode();

        switch (status) {
            case 200:
            case 201:
                Gson gson = new Gson();
                BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));

                Object[] objectData = gson.fromJson(br, a);
                return gson.fromJson(br, cls);

        }
    } catch (IOException ex) {

    } finally{
        if (c != null) {
            try {
                c.disconnect();
            } catch (Exception ex) {
                Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
            }
        }
    }



    return null;

}

}


Solution

  • Solution with the help of Selvin.

    public class MyDownloadHelper {
    
    private static final int timeout = 10000;
    private  Class<? extends Object[]> cls;
    protected static final String API_SERVER = "http://www.translog.nl/json/";
    private Object[] obj;
    
    public MyDownloadHelper(){
    }
    
    protected <T> T download(Class<T> a, String url) throws Exception {
    
        HttpURLConnection c = null;
    
        try {
            URL u = new URL(API_SERVER + url);
            c = (HttpURLConnection) u.openConnection();
            c.setRequestMethod("GET");
            c.setRequestProperty("Content-length", "0");
            c.setUseCaches(false);
            c.setAllowUserInteraction(false);
            c.setConnectTimeout(timeout);
            c.setReadTimeout(timeout);
            c.connect();
            int status = c.getResponseCode();
    
            switch (status) {
                case 200:
                case 201:
                    Gson gson = new Gson();
                    BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
    
                    return (T)gson.fromJson(br, a);
                //return gson.fromJson(br, cls);
    
            }
        } catch (IOException ex) {
    
        } finally{
            if (c != null) {
                try {
                    c.disconnect();
                } catch (Exception ex) {
                    Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    
        return null;
    }
    

    }