Download funktioniert nicht

  • Antworten:36
  • Bentwortet
samtux
  • Forum-Beiträge: 147

01.01.2014, 18:45:58 via Website

Ich habe in meiner App nach dem Tutorial "Download einer Webseite"* einen Download eingebaut.

Ich habe dazu eine neue Klasse "Downloader" angelegt und den Code vom Tut kopiert und dann in meiner Activity:
1private void ladeHerunter(){
2 Downloader downloader = new Downloader(R.id.textView1);
3 downloader.execute("http : //foo.bar"); //Die Leertasten habe ich gemacht, damit ich posten kann...
4}

Eclipse zeigt mir da aber auf Zeile 2 folgenden Fehler:
Multiple markers at this line
- The constructor Downloader(int) is undefined
- webkonsoleVersion cannot be resolved to a
variable

Wie ist es richtig?

*URL zum Tutorial: https://www.nextpit.de/de/android/forum/thread/568854/Tutorial-Download-einer-Webseite

Antworten
Stehpan Graf
  • Forum-Beiträge: 26

01.01.2014, 19:13:55 via App

Wenn du den code vom tutorial kopierst, dann erwartet der konstruktur als Parameter ein onDownloadCompleteListener - Objekt. Du übergibst ihm aber einen integer-wert.
zB.
Downloader.OnDownloadCompleteListener DC = new Down...(){
onDownloadComplete(String result){
textview.setText(result);
}
});
Downloader d = new Download er(DC);
...
LG

— geändert am 01.01.2014, 19:17:31

Antworten
samtux
  • Forum-Beiträge: 147

01.01.2014, 19:17:16 via Website

Und wie muss ich es jetzt machen?

Antworten
samtux
  • Forum-Beiträge: 147

01.01.2014, 19:43:00 via Website

Stehpan Graf
Downloader.OnDownloadCompleteListener DC = new Down...(){
onDownloadComplete(String result){
textview.setText(result);
}
});
Downloader d = new Download er(DC);

Wo muss dieser Code hin und was macht er?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

01.01.2014, 19:43:47 via App

Ähmmm, was du tun sollst?
Eigentlich kannst du alles tun was du willst.
Aber in dem Fall den Code verstehen und benutzen...

LG Pascal //It's not a bug, it's a feature. :) ;)

San Blarnoi

Antworten
samtux
  • Forum-Beiträge: 147

01.01.2014, 19:45:36 via Website

Pascal P.
Aber in dem Fall den Code verstehen und benutzen...
Ich bin noch ziemlich neu in der Android-Programmierung und versteh den Code deshalb nicht...

Antworten
Stehpan Graf
  • Forum-Beiträge: 26

01.01.2014, 19:48:15 via App

Ich nehme an, du hast die Methode ladeHerunter in deiner activity Klasse. Zeile 2 in denen code ersetzen durch diesen code aus downloader.execute machst du d.execute

— geändert am 01.01.2014, 19:51:03

Antworten
samtux
  • Forum-Beiträge: 147

01.01.2014, 19:51:54 via Website

Stehpan Graf
Ich nehme an, du hast die Methode ladeHerunter in deiner activity Klasse.
Ja. So ist es.
Stephan Graf
Zeile 2 in denen code ersetzen durch diesen code aus downloader.execute machst du d.execute()
Welchen Code muss ich statt Zeile 2 schreiben?

Antworten
Stehpan Graf
  • Forum-Beiträge: 26

01.01.2014, 19:59:54 via App

Also,
die Klasse downloader downloadet Sachen Von einer website deiner Wahl.
sie benötigt dabei aber eine codesequenz, die ihr sagt, was sie mit den gedownloadeten Daten tun soll. dafür stellt sie die Schnittstelle OnDownloadCompletedListener bereit.. diese enthält die Methode onDownloadCompleted(String result). wenn du nun ein Objekt der Schnittstelle erzeugst
musst du diese Methode überschreiben. der Parameter result ist hierbei die Zeichenkette der Website. wenn du nun dieses Objekt als Konstruktor-Parameter übergibst, wird die von dir überschriebene Methode aufgerufen, sobald der download beendet wird. in diese Methode gehört also derjenige code hinein, der die Daten der Website verarbeitet.

Antworten
Stehpan Graf
  • Forum-Beiträge: 26

01.01.2014, 20:17:21 via Website

Hier der Code:

public class DeineActivity extends Activity{

TextView textfeld;//objekt wird in onCreate() erzeugt mittels findViewById();

public void ladeHerunter(){

Downloader.OnDownloadCompleteListener dl = new Downloader.OnDownloadCompleteListener(){ //erzeugt die instanz
//der schnittstelle
onDownloadComplete(String result){ //überschrieben der methode
textfeld.setText(result); //inhalt der website wird in textfeld ausgegeben
}
});

Downloader downloader = new Downloader(dl); //erzwugen des downloaders mit instanz der schnittstelle als parameter

downloader.execxute("Deine url"); //ausführen des downloades. ist er beendet, wird
//die methode onDownloadComplete aufgerufen, und der inhalt der seite ausgegeben
}
}

Antworten
samtux
  • Forum-Beiträge: 147

01.01.2014, 20:40:37 via Website

Danke erstmal für den Code!
Aber es kommen immer noch Fehler.
1public void ladeHerunter(){
2 Downloader.OnDownloadCompleteListener dl = new Downloader.OnDownloadCompleteListener(){ //erzeugt die instanz
3 //der schnittstelle
4 onDownloadComplete(String result){ //überschrieben der methode
5 textfeld.setText(result); //inhalt der website wird in textfeld ausgegeben
6 }
7 });
8
9 Downloader downloader = new Downloader(dl); //erzwugen des downloaders mit instanz der schnittstelle als parameter
10
11 downloader.execute("Deine url"); //ausführen des downloades. ist er beendet, wird
12 //die methode onDownloadComplete aufgerufen, und der inhalt der seite ausgegeben
13 }
1. Fehler: Zeile 2: Downloader.OnDownloadCompleteListener cannot be resolved to a
type
2. Fehler: Zeile 7: Syntax error on token ")", delete this token

Antworten
Stehpan Graf
  • Forum-Beiträge: 26

01.01.2014, 20:53:17 via App

)in Zeile löschen

Antworten
samtux
  • Forum-Beiträge: 147

01.01.2014, 21:00:38 via Website

Stehpan Graf
)in Zeile löschen
Ok. Aber der 1. Fehler ist leider immer noch.

Antworten
Stehpan Graf
  • Forum-Beiträge: 26

01.01.2014, 22:18:53 via App

anstatt OnDownloadCompleteListener nur DownloadCompleteListener

Antworten
samtux
  • Forum-Beiträge: 147

01.01.2014, 22:45:58 via Website

Stehpan Graf
anstatt OnDownloadCompleteListener nur DownloadCompleteListener
Dann ändert sich der Fehler nur und auf den Zeilen 4 und 5 entstehen auch noch Fehler.

Ich habe jetzt auch noch ein bischen gesucht und das gefunden: http: //developer-blog.net/programmieren/android-client-php-server-kommunikation/
Würde das auch Funktionieren?

Antworten
impjor
  • Forum-Beiträge: 1.793

01.01.2014, 23:04:33 via App

Du solltest dir zuerst die Grundlagen von Java aneignen, bevor du mit Android anfängst.

Copy&Paste hilft dir dabei null - schadet eher.


Sonst wüsstest du, dass hier einfach der Rückgabewert der Methode fehlt:
1Downloader.OnDownloadCompleteListener dl = new Downloader.OnDownloadCompleteListener(){
2public void onDownloadComplete(String result){
3 textfeld.setText(result);
4 }
5 });

LG

— geändert am 01.01.2014, 23:17:53

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
samtux
  • Forum-Beiträge: 147

01.01.2014, 23:10:42 via Website

Es kommen aber trotzdem noch Fehler...
Ich probiere jetzt mal das andere aus.

Antworten
samtux
  • Forum-Beiträge: 147

01.01.2014, 23:38:21 via Website

samtux
Ich probiere jetzt mal das andere aus.
Das gleiche Problem...
1Error in http connectionandroid.os.NetworkOnMainThreadException
Ich bekomm das mit dem Background-Thread nicht hin :angry:

Antworten
impjor
  • Forum-Beiträge: 1.793

01.01.2014, 23:41:52 via App

Du musst den Downloadvorgang halt in einem anderen Thread/AsyncTask durchführen.

Insofern ist das Tutorial von developer-blog.net veraltet.

LG

— geändert am 01.01.2014, 23:42:13

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
samtux
  • Forum-Beiträge: 147

01.01.2014, 23:45:28 via Website

Ich habe gedacht es ist aktuell genug weil oben ja 9. April 2013 steht.
Ich weiß nur nicht wie ich den Downloadvorgang in einem anderen Thread ausführe...
Ich habe mir ein Buch über die Android-Entwicklung zugelegt nur dort wird das auch nicht bzw. sehr kompliziert beschrieben.

Antworten
impjor
  • Forum-Beiträge: 1.793

01.01.2014, 23:47:41 via App

Mag sein, dass das Tutorial einfach falsch ist.

Dein vorheriger Ansatz war doch eigentlich richtig, warum verfolgst du den nicht weiter?

Natürlich ist Threading selbst etwas komplex, bei Fragen kannst du ja nachfragen.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
samtux
  • Forum-Beiträge: 147

01.01.2014, 23:51:04 via Website

Nach langer Suche habe ich jetzt etwas gefunden!
http: //acadopus.de/android/die-ausfuehrung-der-aufgaben-im-hintergrund_0016.html
Würde es funktionieren, wenn ich den Code von developer-blog.net dort einbaue?
Den Code vom developer-blog finde ich einfach verständlicher.

Antworten
samtux
  • Forum-Beiträge: 147

01.01.2014, 23:58:59 via Website

Ich habe es jetzt ausprobiert.
1final Handler myHandler = new Handler(); // wird automatisch mit aktuellem Thread vebunden.
2 final TextView txtResult = (TextView)findViewById(R.id.webkonsoleVersion);
3 Thread myThread = new Thread(new Runnable() {
4 final String result = downloadWebVersion();
5 myHandler.post(new Runnable() { // Handler benutzen, der mitк UI-Thread verbunden ist
6 @Override
7 public void run() {
8 txtResult.setText(result); // Element ändern
9 }
10 });
11 });
Da kommt jetzt nur 2 Fehler. Auf Zeile 5: Multiple markers at this line
- Syntax error on tokens, AnnotationName expected instead
- Syntax error on tokens, ConstructorHeaderName expected
instead
und auf Zeile 11: Syntax error on token "}", delete this token. Aber das "}" muss doch dort hin? :mad:

Antworten
Stehpan Graf
  • Forum-Beiträge: 26

02.01.2014, 11:15:39 via App

Der jetzige Code im Tutorial sollte funktionieren. Wichtig ist, dass du, wenn du es kopierst auch die Klassen Definition (public class Downloader extends AsyncTask<...> ) mit kopierst. Das tutorial wurde im Laufe der Zeit geändert. schau es dir am besten nochmal an. kann nämlich sein, dass du zwar die neue Version benutzt, aber sie als die alte Version behandelst (instanzierung etc.)

Antworten
samtux
  • Forum-Beiträge: 147

02.01.2014, 17:19:55 via Website

Stehpan Graf
Wichtig ist, dass du, wenn du es kopierst auch die Klassen Definition (public class Downloader extends AsyncTask<...> ) mit kopierst.
Das hab ich gemacht.
Stephan Graf
Das tutorial wurde im Laufe der Zeit geändert. schau es dir am besten nochmal an. kann nämlich sein, dass du zwar die neue Version benutzt, aber sie als die alte Version behandelst (instanzierung etc.)
Das Tutorial ist wohl teilweise falsch??:unsure:

Antworten
samtux
  • Forum-Beiträge: 147

02.01.2014, 17:33:54 via Website

Also ich habe jetzt die Downloader.java kopiert und in meiner Activity habe ich:
1private void startDownload() {
2 Downloader.DownloadCompleteListener dcl = new Downloader.DownloadCompleteListener();
3 @Override
4 public void onDownloadComplete(String result) {
5 TextView tv = (TextView) findViewById(R.id.webkonsoleVersion);
6 tv.setText(result);
7 }
8 );
9
10 Downloader downloader = new Downloader(dcl);
11 downloader.execute("Eine URL, die geladen werden soll");
12 }
Dabei habe ich in Zeile 2 hinten noch ");" angehängt. Ich hoffe das ist so richtig...
Dann habe ich jetzt auf Zeile 2 den Fehler "Cannot instantiate the type Downloader.DownloadCompleteListener". Muss ich die Downloader.java irgendwo einbinden?
Auf Zeile 4 habe ich den Fehler "Multiple markers at this line
- void is an invalid type for the variable
onDownloadComplete
- Syntax error on token ")", ; expected
- Syntax error on token "(", ; expected". Muss ich da "public String ..." schreiben?
Und den Fehler auf Zeile 8 versteh ich überhaupt nicht: "Syntax error on token ")", delete this token".

Antworten
Phil G.
  • Forum-Beiträge: 86

02.01.2014, 17:48:38 via Website

1Dabei habe ich in Zeile 2 hinten noch ");" angehängt. Ich hoffe das ist so richtig...

aeh nein ... du schachtelst falsch -> du kreierst eine "innere" Klassen bzw. ein neues Objekt und hast dabei Klammern vergessen / falsch gesetzt, daher die multiplen Marker

Downloader.DownloadCompleteListener dcl = new Downloader.DownloadCompleteListener()
{
so sollte es gehen
};

Antworten
samtux
  • Forum-Beiträge: 147

02.01.2014, 17:54:02 via Website

Super. Danke!
Wenn ich jetzt, nach Anweisung von Eclipse, auf Zeile 8 die ")" in eine "}" ändere kommt kein Fehler mehr.
Jetzt muss ich nur noch testen ob es funktioniert. Ich werde mich melden.

Antworten
samtux
  • Forum-Beiträge: 147

02.01.2014, 17:56:55 via Website

Super. Danke!
Wenn ich jetzt, nach Anweisung von Eclipse, auf Zeile 8 die ")" in eine "}" ändere kommt kein Fehler mehr.

Antworten
samtux
  • Forum-Beiträge: 147

02.01.2014, 18:10:21 via Website

Jetzt funktioniert alles!
Vielen Dank! :)

Antworten
samtux
  • Forum-Beiträge: 147

02.01.2014, 18:22:02 via Website

Ich hätte da jetzt noch eine Frage: Wie kann ich einen Fehler behandeln? Also das wenn ein Fehler auftritt in die TextView "Fehler!" geschrieben wird.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

02.01.2014, 19:32:54 via Website

Normalerweise macht man das mit try und "catched" dann die Exceptions.
In so einem Catch kannst du dann den Fehler in LogCat und/oder in einer TextBox ausgeben

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
samtux
  • Forum-Beiträge: 147

03.01.2014, 18:11:55 via Website

Im catch() muss ich ja angeben für welche Exception der Block ausgeführt wird. Wie muss ich den catch-Block schreiben, wenn er bei allen Exceptions ausgeführt werden soll?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.01.2014, 18:17:13 via Website

dann allgemein mit
1try{
2//do your things
3}
4catch(Exception e)
5{
6//Auswertung von e oder
7Log.d("Fehler",e.toString());
8}
Aber normalerweise nimmt man absichlich verschiedene Exceptions, damit man sie sofort Unterscheiden kann

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
samtux
  • Forum-Beiträge: 147

03.01.2014, 18:25:23 via Website

Das ist egal. Hauptsache die App stürtzt nicht ab. Ich zeige dem Nutzer sowieso nur ein rotes X mit dem Text "Es ist ein Fehler aufgetreten" an...

Antworten
samtux
  • Forum-Beiträge: 147

03.01.2014, 18:53:21 via Website

Jetzt funktioniert alles. Danke!

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.01.2014, 22:22:08 via Website

Kein Problem!

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten