Get/Post als eigener Thread mit Rückgabe

Fohnbit

Top Contributor
Hallo,

ich nutze Apache Http Client für HTTP Get und Post.
Klappt auch soweit.

Jedoch wenn er in einem Timeout läuft, blockiert meine Klasse weil er auf die Rückgabe wartet.

Wie löst man das am einfachsten?
Eine eigene Klasse für das senden ist klar.

Aber es nutzen ca. 20 Methoden die Klasse mit unterschiedlichen URL`s und wie gebe ich dann der richtigen Methode den richtigen Wert zurück?

Danke!
 
Poste mal bitte den Source Code, dann kann man leichter nachvollziehen was das genaue Problem ist.
Vermutlich willst du mit Future Objekten arbeiten?!
 
Wieviele Methoden eine Klasse benutzen ist ja total schnuppe. Wichtig ist, dass jede Methode ihre eigene Instanz der Klasse benutzt. Damit ist auch klar welche Methode benachrichtigt werden muss wenn der Transfer komplett ist.
 
Guten Morgen,

ich habe 2 Methoden:
Java:
@SuppressWarnings("resource")
    private StringBuffer httpGet(String path, String command) {
        StringBuffer result = new StringBuffer();

        try {
            RequestConfig requestConfig = RequestConfig.custom()
                    .setConnectTimeout(1 * 1000).build();
            HttpClient httpClient = HttpClientBuilder.create()
                    .setDefaultRequestConfig(requestConfig).build();
            String url = "http://" + inetAddress.getHostAddress() + ":" + port
                    + "/" + path + "?"
                    + MyUrlEncode.URLencoding(command, "ISO-8859-1");
            HttpGet getRequest = new HttpGet(url);
            getRequest.addHeader("accept", "application/json");

            HttpResponse response = httpClient.execute(getRequest);

            if (response.getStatusLine().getStatusCode() != 200) {
                throw new RuntimeException("Failed : HTTP error code : "
                        + response.getStatusLine().getStatusCode());
            }

            BufferedReader rd = new BufferedReader(new InputStreamReader(
                    response.getEntity().getContent()));

            String line = "";
            while ((line = rd.readLine()) != null) {
                result.append(line);
            }

            return result;

        } catch (ClientProtocolException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();
        }
        return result;

    }

    private StringBuffer httpPost(String path, String command,
            ArrayList<BasicNameValuePair> parameter)
            throws ClientProtocolException, IOException {
        String url = "http://" + inetAddress.getHostAddress() + ":" + port
                + "/" + path + "?"
                + MyUrlEncode.URLencoding(command, "ISO-8859-1");

        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(1 * 1000).build();
        HttpClient httpClient = HttpClientBuilder.create()
                .setDefaultRequestConfig(requestConfig).build();

        HttpPost post = new HttpPost(url);
        // post.setHeader("User-Agent", USER_AGENT);
        List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
        for (BasicNameValuePair param : parameter) {
            urlParameters.add(param);
        }

        post.setEntity(new UrlEncodedFormEntity(urlParameters));

        HttpResponse response = httpClient.execute(post);
        System.out.println("Response Code : "
                + response.getStatusLine().getStatusCode());

        BufferedReader rd = new BufferedReader(new InputStreamReader(response
                .getEntity().getContent()));

        StringBuffer result = new StringBuffer();
        String line = "";
        while ((line = rd.readLine()) != null) {
            result.append(line);
        }
        return result;
    }

Dann habe ich einige Methoden, die über diese http get und post senden:

Java:
    public void onPlay() {
        System.out.println(httpGet("command", commandRef.Play()));
   
    }


    public void onStop() {
        System.out.println(httpGet("command", commandRef.Stop()));
   
    }
... usw

Nun soll der get/post befehl über einen eigenen Thread abgesetzt werden, damit meine Main Klasse nicht blockiert. Jede Methode, die get/post nutzt bekommt das Ergebnis zurück und soll weiter verarbeitet werden (noch nicht integriert. Nur System.out.println() momentan).

Wie bekomme ich get/post in einen eigenen thread welcher das Ergebnis wieder zur richtigen Methode zurückliefert?

Danke!
 
Du erzeugst dir eine Klasse in der alle Methoden enthalten sind die mit dem http request zu tun haben. Dann erzeugst du überall wo du einen http request brauchst eine eigene Instanz dieser Klasse. Deshalb wurde das OOP ja erfunden. Das nennt sich Kapselung.
 
Ok, danke!

Ich habe nun eine inner Class erstellt:
Java:
class HttpPostThread implements Runnable {

        public String path = "";
        String command = "";
        ArrayList<BasicNameValuePair> parameter;

        public HttpPostThread(String path, String command,
                ArrayList<BasicNameValuePair> parameter) {
            this.path = path;
            this.command = command;
            this.parameter = parameter;
        }

        public void run() {

Spricht etwas gegen einer inner Class?
Ich muss nämlich auf Objekte der Main Klasse vom Thread aus zurück liefern.

Danke!
 

Neue Themen


Zurück
Oben