Öffnen eines Weblinks (Befehllink mit =1 oder =0) im Hintergrund

K

Klayxz

Neues Mitglied
0
Hallo zusammen,

ich bin ganz neu hier und befasse mich auch erst seit ein paar Wochen mit der Android Programmierung. Ich bin HiWi an der Universität des Saarlandes und programmiere eine App, wodurch eine elektrische Fußbodenheizung über W-Lan an bzw. ausgeschaltet werden kann.

Soweit so gut!

Folgendes Problem habe ich:
Ich möchte über den Klick auf einen Button den Webbefehl "schalte die Heizung ein" durchführen (http://irgendwas_steht_hier=1).
Leider wird über die normal übliche Methode OnClick (android:onClick="sendMessage") und

Code:
public void onClick(...) {
Intent myIntent = new Intent(...);
startActivity(myIntent);
}

der Weblink nicht nur ausgeführt sondern auch der Internetbrowser mit dem Link geöffnet. Ich möchte jedoch den Befehl nur im Hintergrund weiter geben.

Natürlich habe ich bereits auf diversen Seiten nach Lösungsansätzen geschaut, aber weder über einen "HTTP Post Request" noch über "AsyncTask" hab ich es hinbekommen. Wahrscheinlich hab ich irgendwo einen Fehler gemacht, weil es damit eigentlich funktionieren sollte.

Ich würde mich echt freuen, wenn mir jemand ein kurzes Beispiel für die Lösung dieses Problems schreiben könnte.

Vielen Dank und viele Grüße aus dem Saarland! :thumbsup:
 
du sagst es schon - http request und asynctask sind deine freunde,

dazu findest bei google sicher 100te beispiele
 
Wenn es wirklich nur darum geht eine simplen HTTP Request zu machen würd ich Volley empfehlen. Kleine Library die Google letztes jahr vorgestellt hat die genau für so Simple GET/POST Geschichten gedacht ist. Dann musst du da nicht extra einen Asynctask bauen nur für einen Request.

Der Quellcode würde dann etwa so aussehen.

Code:
RequestQueue queue = Volley.newRequestQueue(this);
String url = "https://www.blababla.de";

JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
		@Override
		public void onResponse(JSONObject response) {		
		}
	}, new Response.ErrorListener() {
		@Override
		public void onErrorResponse(VolleyError error) {	
		}
	});
queue.add(request);

Um den ganzen Rest kümmert sich Volley. Downloaden kannst du die Library hier z.B.
 
  • Danke
Reaktionen: amfa
Vielen, vielen Dank! Ich werde das Montag direkt mal probieren!
Falls was nicht klappen sollte melde ich mich nochmal ;)
 
Warum so kompliziert:

Code:
URL url;
        StringBuffer buf = new StringBuffer();
        try 
        {
            url = new URL("http://example.com?foo=bar");
            BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
            
            String inputLine;
            while ((inputLine = in.readLine()) != null)
                buf.append(inputLine);

            in.close();    
        } 
        catch (MalformedURLException e) 
        {
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }

So geht es recht schnell. Das ganze in einen AsyncTask und die Sache ist gegessen....
 
Hey Linux4ever,

erst mal recht herzlichen Dank für deinen Beitrag. Hab das soweit probiert, jedoch ist der Rahmen noch nicht richtig! Würdest du mir noch kurz zeigen wollen, wie ich den AsynTask-Rahmen drumsetzen kann!
-> Wäre super!

Vielen Dank und Liebe Grüße
Jerome

Bisheriger Quellcode:
Code:
public void Einschalten_S1(View v) {
        URL url;
        StringBuffer buf = new StringBuffer();
        try 
        {
            url = new URL("http://192.168.101.50/cgi-bin/schalten?steckdose_nr=1&steckdose_soll=1");
            BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
            
            String inputLine;
            while ((inputLine = in.readLine()) != null)
                buf.append(inputLine);

            in.close();    
        } 
        catch (MalformedURLException e) 
        {
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
        }


Vorher - Code bei der das Fenster im Browser noch geöffnet wird:

Code:
@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends Activity {

public void Einschalten_S2(View v) {
        Intent browser_einschalten_S2 = new Intent(Intent.ACTION_VIEW, 
                Uri.parse("http://192.168.101.50/cgi-bin/schalten?steckdose_nr=2&steckdose_soll=1"));
        startActivity(browser_einschalten_S2);
        int i=5;
        Toast.makeText(this, "Einschalten", i).show();
    }

}
 
Grundaufbau eines Asynctask:

Code:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Locale;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.AsyncTask;

public class AsyncTaskDoSth extends AsyncTask<Void, Void, Boolean>
{
    public ProgressDialog progress;
    public Context context;
    
    public UpdateSettingsTask(Context context)
    {
        this.context = context;
    }
    
    @Override
    protected Boolean doInBackground(Void... params) // Die Aktion
    {                    
        if (buf.toString().toLowerCase(Locale.GERMANY).contains("*IRGENDWAS, WAS DEINE SEITE BEI ERFOLG AUSGIBT*"))
            return true;
        else
            return false;
    }

    @Override
    protected void onPostExecute(final Boolean success) // Wird nach der auszuführenden Aktion aufgerufen
    {
        progress.dismiss();
        
        if (success)
        {
            
        }
        else
        {
            
        }
    }

    @Override
    protected void onCancelled() // Wird bei Abbruch aufgerufen
    {
        progress.dismiss();
    }
    
    @Override
    protected void onPreExecute() // Wird vor der auszuführenden Aktion aufgerufen
    {
        progress = new ProgressDialog(context);
        progress.setTitle("Bitte warten...");
        progress.setMessage("Speichere Einstellungen");
        progress.setCancelable(false);
        progress.setIndeterminate(true);
        progress.show();
    }
}
Ausführen mit:
Code:
AsyncTaskDoSth doSth = new AsyncTaskDoSth(context);
doSth.execute((Void) null);
Den Context bekommst Du mit einer z.B. public Variable, die im onCreate mit context = this; initialisiert wird...

EDIT: Dieses ist einfach aus einem Projekt herauskopiert. Das heißt, ich habe es speziell für mich angepasst. Bei grundlegenden Informationen hier schauen: http://developer.android.com/reference/android/os/AsyncTask.html

EDIT2: WIe auch Context, kannst Du auch mehrere Variablen mitgeben: Diese müssen dann einfach mit in die "Ausführklammer" und halt im AsyncTask wo this.context = context steht mit initialisiert werden. Z.B. Die Steckdosennummer in Deinem Beispiel. Du brauchst also einfach nur diese eine Klasse und kannst sie mit verschiedenen Parametern aufrufen.
 
Zuletzt bearbeitet:
Hast du mal die Doku zum AsynTask gelesen?
AsyncTask | Android Developers

Da ist eigentlich alles recht gut erklärt.
Das beispiel was dort genutzt wird ist doch schon fast genau das was du brauchst.
 

Ähnliche Themen

S
Antworten
9
Aufrufe
1.190
swa00
swa00
B
Antworten
4
Aufrufe
470
bb321
B
D
  • djsnoopy
Antworten
6
Aufrufe
613
djsnoopy
D
Zurück
Oben Unten