Problem bei Umsetzung des Projekts "Kommunikation mit Online-DB""

F

FeuerwehrAdmin

Neues Mitglied
0
Hallo Community,

ich bin neu hier, wie Ihr alle seht und möchte mein Tool, welches ich für unsere Feuerwehr kostenfrei in PHP und MySQL programmiert habe, nun auch als APP realisieren. Also muss ich ja nun auch noch JAVA lernen. Will aber nicht ganz vorne anfangen, denn ich bin ja schon 54 Jahre und möchte dementsprechend bald fertig werden.

Da kam mir das Script

"Beispiel: App die mittels PHP und JSON mit einer Online DB kommuniziert" von Mitglied "kosmos"

als Startpunkt für die APP gerade recht.

In meinem Android Studio ist ALLES rot. Ein Profi weiß bestimmt, was ich falsch gemacht habe.

Ich denke, dass die Zuordnungen und Namensgebungen oft falsch sind. Die Ausgabe im Messages Gradle Build ist leider sehr lang:


Code:
Information:Gradle tasks [:app:generateDebugSources, :app:generateDebugAndroidTestSources, :app:assembleDebug]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72310Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2310Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72310Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42310Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources
:app:processDebugManifest
:app:processDebugResources
:app:generateDebugSources
:app:preDebugAndroidTestBuild UP-TO-DATE
:app:prepareDebugAndroidTestDependencies
:app:compileDebugAndroidTestAidl UP-TO-DATE
:app:processDebugAndroidTestManifest UP-TO-DATE
:app:compileDebugAndroidTestRenderscript UP-TO-DATE
:app:generateDebugAndroidTestBuildConfig UP-TO-DATE
:app:generateDebugAndroidTestAssets UP-TO-DATE
:app:mergeDebugAndroidTestAssets UP-TO-DATE
:app:generateDebugAndroidTestResValues UP-TO-DATE
:app:generateDebugAndroidTestResources UP-TO-DATE
:app:mergeDebugAndroidTestResources UP-TO-DATE
:app:processDebugAndroidTestResources UP-TO-DATE
:app:generateDebugAndroidTestSources UP-TO-DATE
:app:processDebugJavaRes UP-TO-DATE
:app:compileDebugJavaWithJavac
C:\Users\Admin\AndroidStudioProjects\NochEins\app\src\main\java\de\schoppenhonne\nocheins\DBRequestTask.java
Error:(6, 36) error: cannot find symbol class AsyncTask
Error:(14, 5) error: method does not override or implement a method from a supertype
Error:(20, 13) error: cannot find symbol class URL
Error:(20, 27) error: cannot find symbol class URL
Error:(21, 13) error: cannot find symbol class HttpURLConnection
Error:(21, 39) error: cannot find symbol class HttpURLConnection
Error:(36, 38) error: cannot find symbol variable URLEncoder
Error:(38, 38) error: cannot find symbol variable URLEncoder
Error:(40, 17) error: cannot find symbol class OutputStream
Error:(41, 17) error: cannot find symbol class BufferedWriter
Error:(41, 45) error: cannot find symbol class BufferedWriter
Error:(42, 29) error: cannot find symbol class OutputStreamWriter
Error:(50, 13) error: cannot find symbol class InputStream
Error:(51, 13) error: cannot find symbol class InputStreamReader
Error:(51, 44) error: cannot find symbol class InputStreamReader
Error:(65, 5) error: method does not override or implement a method from a supertype
C:\Users\Admin\AndroidStudioProjects\NochEins\app\src\main\java\de\schoppenhonne\nocheins\EintragAdapter.java
Error:(6, 37) error: cannot find symbol class BaseAdapter
Error:(7, 13) error: cannot find symbol class ArrayList
Error:(8, 13) error: cannot find symbol class Context
Error:(10, 27) error: cannot find symbol class Context
Error:(16, 12) error: cannot find symbol class ArrayList
Error:(36, 39) error: cannot find symbol class View
Error:(36, 57) error: cannot find symbol class ViewGroup
Error:(36, 12) error: cannot find symbol class View
Error:(12, 33) error: cannot find symbol class ArrayList
Error:(20, 5) error: method does not override or implement a method from a supertype
Error:(25, 5) error: method does not override or implement a method from a supertype
Error:(30, 5) error: method does not override or implement a method from a supertype
Error:(35, 5) error: method does not override or implement a method from a supertype
Error:(37, 9) error: cannot find symbol class View
Error:(39, 13) error: cannot find symbol class LayoutInflater
Error:(39, 40) error: cannot find symbol class LayoutInflater
Error:(40, 39) error: cannot find symbol variable Context
Error:(41, 45) error: cannot find symbol variable eintrag_layout
Error:(43, 9) error: cannot find symbol class TextView
Error:(43, 30) error: cannot find symbol class TextView
Error:(45, 9) error: cannot find symbol class View
Error:(47, 9) error: cannot find symbol class View
C:\Users\Admin\AndroidStudioProjects\NochEins\app\src\main\java\de\schoppenhonne\nocheins\MainActivity.java
Error:(29, 17) error: no suitable method found for setAdapter(EintragAdapter)
method AdapterView.setAdapter(ListAdapter) is not applicable
(argument mismatch; EintragAdapter cannot be converted to ListAdapter)
method AbsListView.setAdapter(ListAdapter) is not applicable
(argument mismatch; EintragAdapter cannot be converted to ListAdapter)
method ListView.setAdapter(ListAdapter) is not applicable
(argument mismatch; EintragAdapter cannot be converted to ListAdapter)
Error:(34, 61) error: cannot find symbol variable basis_url
Error:(42, 41) error: cannot find symbol variable main
Error:(80, 51) error: cannot find symbol variable basis_url
Error:(112, 55) error: cannot find symbol variable basis_url
Error:(127, 39) error: cannot find symbol variable basis_url
Error:(149, 35) error: cannot find symbol method notifyDataSetChanged()
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.
Information:BUILD FAILED
Information:Total time: 2.304 secs
Information:46 errors
Information:0 warnings
Information:See complete output in console


Ist hier sehr viel zu ändern und anzupassen, oder schaffe ich das mit etwas Unterstützung von Euch?

Ich habe vorher schon ein paar Anleitungen und Skripte gefunden. Aber bei meinen Versuchen, diese nachzuspielen, waren diese immer mit Fehlermeldungen verbunden. Wie zum Beispiel:

"darf nicht im Main Thread ausgeführt werden"

oder:

"there was internal server error while processing your request"

Und immer wieder:

"das rote R."


Ihr kennt das ja bestimmt auch, von Euren Anfängen.

Ich habe mir auch schon 2 Bücher gekauft und schnell überflogen. Doch wird nirgends auf HttpClient, HttpURLConnection oder AsyncTask eingegangen. Also Fehlkäufe. Und ich muss schnell lernen.

Über eine Nachricht freue ich mich. Wenn weitere Infos benötigt werden, kein Problem. Übrigens helfe ich gerne bei dem, was ich kann - siehe oben.
 
Zuletzt bearbeitet von einem Moderator:
Sorry für die Smileys. Habe den Text nicht maskiert. Die Zunge-raus-Smileys sind DoppelpunktP und die Stirnrunzel-Smileys sind DoppelpunktKlammerauf.
 
Hier mal die MainActivity:



Code:
package de.schoppenhonne.nocheins;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity implements DBResultHandler {

private EintragAdapter eintragAdapter;
private EditText eingabefeld;
private Eintrag eintrag;

@override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.container);
eintragAdapter = new EintragAdapter(this);
listView.setAdapter(eintragAdapter);
ladeDaten();
}

private void ladeDaten() {
(new DBRequestTask(this)).execute(getString(R.string.basis_url)
+ "selectall.php");
}

@override
public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.hinzufuegenButton) {
neuerEintrag();
return true;
}
return super.onOptionsItemSelected(item);
}

private void neuerEintrag() {
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this);
alertBuilder.setTitle("Neuer Eintrag");
eingabefeld = new EditText(this);
alertBuilder.setView(eingabefeld);
alertBuilder.setCancelable(true);
alertBuilder.setNegativeButton("Abbrechen",
new DialogInterface.OnClickListener() {

@override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();

}
});
alertBuilder.setPositiveButton("OK",
new DialogInterface.OnClickListener() {

@override
public void onClick(DialogInterface dialog, int which) {
(new DBRequestTask(MainActivity.this)).execute(
getString(R.string.basis_url) + "insert.php",
"Eintrag", eingabefeld.getText().toString());
}
});

alertBuilder.create().show();
}

public void doEdit(View view) {
if (view.getTag() instanceof Eintrag) {
eintrag = (Eintrag) view.getTag();
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this);
alertBuilder.setTitle("Eintrag bearbeiten");
eingabefeld = new EditText(this);
eingabefeld.setText(eintrag.getEintrag());
alertBuilder.setView(eingabefeld);
alertBuilder.setCancelable(true);
alertBuilder.setNegativeButton("Abbrechen",
new DialogInterface.OnClickListener() {

@override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();

}
});
alertBuilder.setPositiveButton("OK",
new DialogInterface.OnClickListener() {

@override
public void onClick(DialogInterface dialog, int which) {
(new DBRequestTask(MainActivity.this)).execute(
getString(R.string.basis_url)
+ "update.php", "Eintrag",
eingabefeld.getText().toString(), "ID",
Integer.toString(eintrag.getId()));
}
});

alertBuilder.create().show();
}
}

public void doDelete(View view) {
if (view.getTag() instanceof Eintrag) {
eintrag = (Eintrag) view.getTag();
(new DBRequestTask(MainActivity.this)).execute(
getString(R.string.basis_url) + "delete.php", "ID",
Integer.toString(eintrag.getId()));

}
}

@override
public void ergebnisVerarbeiten(String ergebnis) {
try {
JSONObject jsonErgebnis = new JSONObject(ergebnis);
JSONArray statusArray = jsonErgebnis.getJSONArray("Status");
int status = statusArray.getInt(0);
switch (status) {
case 0:
JSONArray datenArray = jsonErgebnis.getJSONArray("Liste");
eintragAdapter.getEintragListe().clear();
for (int i = 0; i < datenArray.length(); i++) {
JSONObject einzelsatz = datenArray.getJSONObject(i);
eintragAdapter.getEintragListe().add(
new Eintrag(einzelsatz.getInt("ID"), einzelsatz
.getString("Eintrag")));
}
eintragAdapter.notifyDataSetChanged();
break;
case 1:
Toast.makeText(this, statusArray.getString(1),
Toast.LENGTH_SHORT).show();
ladeDaten();
break;
case 2:
Toast.makeText(this, statusArray.getString(1),
Toast.LENGTH_SHORT).show();
ladeDaten();
break;
case 3:
Toast.makeText(this, statusArray.getString(1),
Toast.LENGTH_SHORT).show();
ladeDaten();
break;

default:
Toast.makeText(this, statusArray.getString(1),
Toast.LENGTH_SHORT).show();
break;
}
} catch (JSONException e) {
Toast.makeText(this,
"Serverantwort konnte nicht verarbeitet werden",
Toast.LENGTH_SHORT).show();
}
}

}
[doublepost=1447177994,1447172757][/doublepost]In der MainActivity ist nun nichts mehr rot. Vorher waren rot:
Code:
 execute
basis_url 
// und 
main[code]. 
Wie ich execute hinbekommen habe, weiß ich nicht mehr. Für basis_url habe ich in der strings.xml einen String erstellt. Und aus main, also
[code]getMenuInflater().inflate(R.menu.main, menu)
habe ich
Code:
getMenuInflater().inflate(R.menu.menu_main, menu)
gemacht. Denn das o. a.
Code:
ListView
hatte ich in eine
Code:
menu_main.xml
gepackt. Es wurde kein Name der Datei genannt, daher hatte ich mich für diesen Namen entschieden.

Ich hoffe, ich habe bishier alles richtig gemacht.

In der EintragAdapter war auch sehr viel rot. Hier habe ich z. B. den
Code:
android.widget.BaseAdapter
, die
Code:
android.view.ViewGroup
und die
Code:
java.util.ArrayList
importiert. Nun ist nur noch rot:
Code:
eintrag_layout

Muss ich hier eine
Code:
eintrag_layout.xml
erstellen? Was käme da rein?

Und die
Code:
DBRequestTask.java
ist auch nur noch ein wenig rot:

Code:
package de.schoppenhonne.nocheins;


import android.os.AsyncTask;

import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;



/**
* Created by Admin on 09.11.2015.
*/
public class DBRequestTask extends AsyncTask<String, Void, String> {
private DBResultHandler handler;

public DBRequestTask(DBResultHandler handler) {
super();
this.handler = handler;
}

[USER=3517]@override[/USER]
protected String doInBackground(String... params) {
String ergebnis = "";
try {
if (params.length % 2 == 0)
throw new Exception("Gerade Zahl an params ist nicht logisch");
URL url = new URL(params[0]);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
if (params.length > 1) {
StringBuilder postDaten = new StringBuilder();
boolean erster = true;
for (int i = 1; i < params.length; i = i + 2) {
if (erster) {
erster = false;
} else {
postDaten.append("&");
}
postDaten.append(URLEncoder.encode(params, "UTF-8"));
postDaten.append("=");
postDaten.append(URLEncoder.encode(params[i + 1], "UTF-8"));
}
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(os, "UTF-8"));
writer.write(postDaten.toString());
writer.flush();
writer.close();
os.close();
}
conn.connect();
StringBuilder antwort = new StringBuilder("");
InputStream inputStream = conn.getInputStream();
InputStreamReader reader = new InputStreamReader(inputStream,
"UTF-8");
char[] buffer = new char[128];
while (reader.read(buffer) > 0) {
antwort.append(buffer);
}
inputStream.close();
ergebnis = antwort.toString();
} catch (Exception e) {
ergebnis = "{\"Status\":[\"-1\",\"HTTP Connection Problem\"]}";
}
return ergebnis;
}

[USER=3517]@override[/USER]
protected void onPostExecute(String result) {
handler.ergebnisVerarbeiten(result);
}

}

Hier sind nur noch
OutputStream
und close()
rot. Muss ich hier eine Klasse erstellen und was kommt da rein?

Wäre über Denkanstöße dankbar.
 
Zuletzt bearbeitet:
Okay, fangen wir erst mal bei den Basics (also der Refferenzierung der R-Klasse) an.. Da ich im Pfad AndroidStudio sehe, gehe ich davon aus, dass du die IDE nutzt. Wäre hilfreich, wenn du den den Inhalt deiner gradle-datei zeigen würdest.
Vielleicht ist da was fehl am Platz.

Ansonsten kann das "rote R" durch "clean" bzw. "rebuild project" behoben werden. Bist du sicher, dass dein Manifest i.O. ist? Das kann auch Probleme mit der R-Klasse hervorrufen.
Falls alles nichts bringt (oder du nicht weiter weißt), kommentiere solange aus, bis es funktioniert. Solange R nicht aufgelöst werden kann, brauchst du dir über andere Probleme erstmal keine Gedanken machen, da es sowieso schon zum Scheitern verurteilt wäre. Dementsprechend hat die Fehlerfindung hier wie gesagt Vorrang.

Wichtig: Wenn ich "gradle" schreibe, meine ich das innere (auf das Modul bezogene gradle-file) und nicht das äußere "Top-Level"-gradle.

Da es ab BuildTools >23.0.0 zu Problemen mit dem Client kommt, hier eine gradle-Konfiguration, die die Nutzung des HttpClient wieder ermöglicht:

Code:
apply plugin: 'com.android.application'
repositories {
jcenter()
}

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.4.0-beta6' // <- wichtig (kann auch durch neuere Versionen ersetzt werden, siehe Link ganz unten -
                                                                             // ältere Versionen unterstützen, den Eintrag "useLibray", s.u. in "android-Tag", nicht)
}
}

android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
useLibrary 'org.apache.http.legacy' // <- hiermit wird die Nutzung des Clients überhaupt erst möglich.
defaultConfig {
applicationId 'com.pepperonas.samplerecordbreaker' // <- anpassen
minSdkVersion 9
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_6
targetCompatibility JavaVersion.VERSION_1_6
}
productFlavors {
}
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.0'
}

* https://jcenter.bintray.com/com/android/tools/build/gradle/
 
Hallo missspelled,

vielen Dank für Deine Hilfe. Das "rote R"-Problem habe ich nicht mehr.
Deinen Tip zu dem "BuildTools >23.0.0"-Problem schaue ich mir an und teste. Bin jetzt allerdings an der Arbeit.
Die "gradle"-File kann ich mal posten.

Ich fasse mal zusammen:
In der MainActivity ist nur noch "eintrag_layout" rot.
In der DBRequestTask ist nur noch "OutputStream" und "close()" rot.


Vielen Dank und einen schönen Tag allesamt.


 
Es gibt unterschiede ob Rot oder Rot mit Verbesserungsvorschlag. Hovere mal deine Maus über den Fehler was sagt dir Android Studio da?
 
Danke Jaiel, schaue mal nach. Muss aber noch arbeiten und dann ist heute noch Dienst bei der Feuerwehr. Bin ab 21:30 Uhr zuhause.
 
OutputStream ist eine Standard Javaklasse, die musst du nicht erstellen, aber der Import fehlt.
In der eintrag_layout.xml ist im Tutorial das Layout für einen einzelnen Eintrag in der ListView.
Möchtest du einfach nur das Tutorial nachbauen oder was hast du vor?

p. s. das Problem mit dem HTTPClient und BuildTool > v23 sollte bei dir nicht auftreten, da in dem Beispiel kein HTTPClient verwendet wird
 
  • Danke
Reaktionen: FeuerwehrAdmin
So, endlich zu Hause, will ich mir mal Eure gut gemeinten Tipps anschauen und probieren.

Zuerst der neue "Gradle"-Code. Als ich den eingegeben und anschließend synchronisiert habe, weil das mir vorgeschlagen wurde, hatte ich ziemlich krasse Fehler. Habe daher die Änderung erst mal wieder rückgängig gemacht, indem ich den neuen Code auskommentiert habe. Sehr selbst:

Code:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "de.schoppenhonne.nocheins"
minSdkVersion 23
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.0'
compile 'com.android.support:design:23.1.0'
compile 'com.mcxiaoke.volley:library:1.0.18'
}


/*
apply plugin: 'com.android.application'
repositories {
jcenter()
}
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.4.0-beta6' // <- wichtig (kann auch durch neuere Versionen ersetzt werden, siehe Link ganz unten -
// ältere Versionen unterstützen, den Eintrag "useLibray", s.u. in "android-Tag", nicht)
}
}
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
useLibrary 'org.apache.http.legacy' // <- hiermit wird die Nutzung des Clients überhaupt erst möglich.
defaultConfig {
applicationId 'com.pepperonas.samplerecordbreaker' // <- anpassen
minSdkVersion 9
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_6
targetCompatibility JavaVersion.VERSION_1_6
}
productFlavors {
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.0'
}
*/

Habe jetzt in der DBRequestTask OutputStream importiert. Jetzt sind weder OutputStream noch UTF-8 noch close() rot.

Eigentlich sieht es ganz gut aus. Testen tue ich es morgen Abend, bevor es jetzt doch nicht klappt und ich mich wieder festfresse.

Eich danke ich auf jeden Fall schon mal ganz lieb. Meine Feuerwehrkameraden freuen sich schon, obwohl ich gar nicht weiß, ob ich die APP jemals schaffe. Wie gesagt: PHP mit MySQL und ein bisschen Javascript passen mir viel besser und ich habe schon ein tolles Vereinstool mit allem PiPaPo geschafft. Es funktioniert sogar auf Smartphone, aber halt im Browser und nicht als APP.

Hatte schon mal recherchiert, wie das mit Hybrid-APPs ist. also die, die einem vorgaukeln, eine APP zu sein. Aber die lassen sich aus einem reinem PHP-Script ja nicht realisieren. Daher will ich nun also auf die Schnelle JAVA und vielleicht noch Objective-C oder Swift nur soweit lernen, dass ich meine Kumpels durch die Reihe glücklich mache, egal ob Android oder iOS.

So, ich wünsche Euch erstmal eine gute Nacht und vielen Dank. Wenn ich nun nicht klar komme, werde ich wieder rumjammern. Und selbstversatändlich helfe ich auch bei PHP und MySQL.
[doublepost=1447280474,1447280311][/doublepost]Ach ja, Jaiel, morgen höre ich mir mal Deine Lieder an. :biggrin:
 
Hallo, ich bin doch ein bisschen blöd.. Den Client brauchst du gar nicht.
Hier eine Alternative, die meiner Meinung nach zweckdienlicher ist (stelle gerade mal den kompletten Code bereit)

Code:
import android.os.AsyncTask;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
/**
* @author Martin Pfeffer (pepperonas)
*/
public class SampleAsyncTask extends AsyncTask<String, String, String> {

private static final String TAG = "SampleAsyncTask";
private SampleAsyncTaskListener listener;
public SampleAsyncTask(SampleAsyncTaskListener l) {
listener = l;
}


@Override
protected void onPreExecute() {
super.onPreExecute();
}


@Override
protected String doInBackground(String... params) {

URL url;
String text = "";
try {

url = new URL(params[0]);
URLConnection urlConnection = url.openConnection();
urlConnection.connect();
InputStream is = new BufferedInputStream(url.openStream(), 8192);
text = convertStreamToString(is);
is.close();
} catch (IOException e) {
listener.onFailed("An error occurred.");
e.printStackTrace();
}

listener.onSuccess(text);
return text;
}


@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}


public static String convertStreamToString(InputStream inputStream) {
java.util.Scanner s = new java.util.Scanner(inputStream).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
}
}


dazu gehört noch ein kleines Interface:
Code:
public interface SampleAsyncTaskListener {

public void onSuccess(String s);
public void onFailed(String s);
}

und aufgerufen werden kann der Code dann wie folgt:
Code:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
public class MainActivity extends AppCompatActivity implements SampleAsyncTaskListener {

private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Alternative A:
new SampleAsyncTask(this).execute("http://ws.spotify.com/lookup/1/?uri=spotify:track:6NmXV4o6bmp704aPGyTVVG");

// B macht das gleiche:
new SampleAsyncTask(new SampleAsyncTaskListener() {
@Override
public void onSuccess(String s) {
Log.i(TAG, "onSuccess " + s);
}


@Override
public void onFailed(String s) {
Log.e(TAG, "onFailed " + s);
}
}).execute("http://ws.spotify.com/lookup/1/?uri=spotify:track:6NmXV4o6bmp704aPGyTVVG");
}


@Override
public void onSuccess(String s) {
Log.i(TAG, "onSuccess " + s);
}


@Override
public void onFailed(String s) {
Log.e(TAG, "onFailed " + s);
}
}

Wenn du damit nicht hinkommen solltest, hätte ich noch ne relativ umfangreiche Library pepperonas/Base · GitHub , ist aber derzeit eher ein Testprojekt als etwas "Handfestes" - (somit eher was für Experten, da vieles ggf. verbesserungswürdig ist).
 
  • Danke
Reaktionen: FeuerwehrAdmin
Ich glaube, ich muss hier weitermachen, wenn ich mich mehr konzentrieren kann. Sonst hat das keinen Sinn. Habe soviel um die Ohren. Ich danke Euch vielmals und melde mich wieder.

Hallo Jaiel, habe mir die Musikstücke angehört. Hast Du die komponiert? Und womit?

Seid gegrüßt.
Dirk
 
FeuerwehrAdmin schrieb:
Hallo Jaiel, habe mir die Musikstücke angehört. Hast Du die komponiert? Und womit?

Seid gegrüßt.
Dirk

Auch dir schöne Grüße :)

Ja selbst komponiert. Hat es dir gefallen? :D

Hier habe ich angefangen die MElodie einzugeben, dann kommt da manchmal etwas Gutes bei raus :D
Realm of Sadness (#119439)

Und dann über ein professionelleres Tool dann mit richtigen Noten und besseren Instrumentklängen.
Und dann auf deren Webseite hochgeladen auf meinen Account.

Musescore nennt sich das Programm so wie die Webseite :)
 
@missspelled

In dem Codebeispiel muss der Objekt urlConnection am Ende beendet werden, sonst hast du ein recht großes Speicherleck (mit der Chance auf schöne Heisenburgs).
Der Inputstream wird auch nicht vernünftig beendet. Wenn ein Fehler auftritt (z.B. ein Verbindungsabruch), bleibt auch er offen. Ein zweites Memory Leak.


Noch ein Nachtrag zu deiner Konstruktion. Da beißt sich die Schlang in den Schwanz. Der Sinn eines Asynctask ist es eigentlich, sich ein Observer (Listener) zu sparen. ;)

AsyncTask allows you to perform asynchronous work on your user interface. It performs the blocking operations in a worker thread and then publishes the results on the UI thread, without requiring you to handle threads and/or handlers yourself.
Processes and Threads | Android Developers









 
  • Danke
Reaktionen: missspelled
@markus.tullius wie "beendet" man die urlConnection?
 
Es gibt mehrere Möglichkeiten:

a) Man benutzt die Subklassen HttpUrlConnection oder HttpsUrlConnection. Dann hat man die Mögklichkeit die Verbindung mit der Methode disconnect() zu beenden.

b) Wenn man so vorgeht, wie du, muss man zwei Timeouts setzen. Dafür gibt die beiden Methoden setConnectTimeout (int timeoutMillis) und setReadTimeout (int timeoutMillis).

URLConnection | Android Developers (Kapitel Timeouts)
 
  • Danke
Reaktionen: missspelled

Ähnliche Themen

M
Antworten
2
Aufrufe
636
Mozart40
M
D
Antworten
17
Aufrufe
429
datNeMo
D
M
Antworten
3
Aufrufe
200
moin
M
Zurück
Oben Unten