Spieleserver Hilfsapp

  • 15 Antworten
  • Letztes Antwortdatum
InyaProduction

InyaProduction

Neues Mitglied
0
http://tune.finalcut3.com/android/finalcut3.apk

Dort habe ich eine kleine App erstellt mit der man sich die Charactere und Gilden in unserem Spiel ausgeben lassen kann. Auf meinem Handy dem Samsung Galaxy Y GT-S5360 klappt alles einwandfrei. Auf anderen Handys kommt es allerdings nicht zur Ausgabe der Daten sondern sie erhalten Fehlermeldungen...
Einzelne Teile des Codes gebe ich auf Anfrage raus ansonsten wäre das viel zu viel.

Danke im Vorraus :D
 
Mein Y hat 2.3.5 auf dem funktioniert auch alles. Aber auf denen meiner Freunde nicht.

Keine Fehlermeldung - es kommen einfach nur keine Daten an
 
Schon den Thread durchgelesen?
evtl. ist die NetworkOnMainThreadException gecatcht aber nciht behandelt, dafür spricht, dass du 2.3.5 hast.
 
Thread gelesen das könnte es sein aber wie behebe ich das? Ich bin totaler Anfänger..
 
Alles was mit internet ist in doinbackground stecken, alles was auf den ui-thread zugreifen muss (textanzeige, bildanzeige) in onpostexecute. Das ist aber nur die kurzform. Google mal, es gibt viele gute tutorials.

Gesendet von meinem GT-S5660 mit der Android-Hilfe.de App
 
Code:
package com.finalcut3.tune;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.*;

public class player_searchActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.player_search);

        final Button sendBtn = (Button)findViewById(R.id.player_searchOpen);
        final EditText inputText = (EditText)findViewById(R.id.player_searchEdit);
        final TextView playerStatusText = (TextView)findViewById(R.id.player_searchStatus);
        final TextView playerRaceText = (TextView)findViewById(R.id.player_searchRace);
        final TextView playerLevelText = (TextView)findViewById(R.id.player_searchLevel);
        final TextView playerGuildText = (TextView)findViewById(R.id.player_searchGuild);
        final TextView playerPlaytimeText = (TextView)findViewById(R.id.player_searchPlaytime);
        sendBtn.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                if (inputText.getText().toString().length() == 0){
                    Toast.makeText(getApplication(), "Du musst einen Namen eingeben", Toast.LENGTH_LONG).show();
                } else {
                    //OnlineStatus Anfang
                    InputStream is;
                    String result = "";
                    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                    try{
                        HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost("http://tune.finalcut3.com/android/player_search/search_player.php?name=" + inputText.getText().toString());
                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                        HttpResponse response = httpclient.execute(httppost);
                        HttpEntity entity = response.getEntity();
                        is = entity.getContent();
                        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                        StringBuilder sb = new StringBuilder();
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                            sb.append(line);
                        }
                        is.close();
                        result=sb.toString();
                        if (result.toString() == "") {
                            playerStatusText.setText("Kein Spieler gefunden");
                            Toast.makeText(getApplication(), "Kein Spieler gefunden", Toast.LENGTH_LONG).show();
                            playerRaceText.setText("");
                            playerLevelText.setText("");
                            playerGuildText.setText("");
                            playerPlaytimeText.setText("");
                        } else {
                            playerStatusText.setText(result);
                            getRace();
                            getLevel();
                            getPlaytime();
                            getGuild();
                        }
                    }catch(Exception e){
                        Log.e("log_tag", "Fehler bei der http Verbindung "+e.toString());
                    }
                    //OnlineStatus Ende
                    
                    }
                }
                public void getRace(){
                    //Rasse Anfang
                    InputStream is1;
                    String result1 = "";
                    ArrayList<NameValuePair> nameValuePairs1 = new ArrayList<NameValuePair>();
                    try{
                        HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost("http://tune.finalcut3.com/android/player_search/search_race.php?name=" + inputText.getText().toString());
                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs1));
                        HttpResponse response = httpclient.execute(httppost);
                        HttpEntity entity = response.getEntity();
                        is1 = entity.getContent();
                        BufferedReader reader = new BufferedReader(new InputStreamReader(is1,"iso-8859-1"),8);
                        StringBuilder sb = new StringBuilder();
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                            sb.append(line);
                        }
                        is1.close();
                        result1=sb.toString();
                        playerRaceText.setText("Rasse: " + result1);
                    }catch(Exception e){
                        Log.e("log_tag", "Fehler bei der http Verbindung "+e.toString());
                    }
                    //Rasse Ende
                }    
                public void getLevel(){
                    //Level Anfang
                    InputStream is1;
                    String result = "";
                    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                    try{
                        HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost("http://tune.finalcut3.com/android/player_search/search_level.php?name=" + inputText.getText().toString());
                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                        HttpResponse response = httpclient.execute(httppost);
                        HttpEntity entity = response.getEntity();
                        is1 = entity.getContent();
                        BufferedReader reader = new BufferedReader(new InputStreamReader(is1,"iso-8859-1"),8);
                        StringBuilder sb = new StringBuilder();
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                            sb.append(line);
                        }
                        is1.close();
                        result=sb.toString();
                        playerLevelText.setText("Level: " + result);
                    }catch(Exception e){
                        Log.e("log_tag", "Fehler bei der http Verbindung "+e.toString());
                    }
                    //Level Ende
                }    
                public void getGuild(){
                    //Gilde Anfang
                    InputStream is1;
                    String result = "";
                    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                    try{
                        HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost("http://tune.finalcut3.com/android/player_search/search_guild.php?name=" + inputText.getText().toString());
                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                        HttpResponse response = httpclient.execute(httppost);
                        HttpEntity entity = response.getEntity();
                        is1 = entity.getContent();
                        BufferedReader reader = new BufferedReader(new InputStreamReader(is1,"iso-8859-1"),8);
                        StringBuilder sb = new StringBuilder();
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                            sb.append(line);
                        }
                        is1.close();
                        result=sb.toString();
                        if (result == ""){
                            playerGuildText.setText("Gilde: Keine Gilde");
                        } else {
                            playerGuildText.setText("Gilde: " + result);
                        }
                    }catch(Exception e){
                        Log.e("log_tag", "Fehler bei der http Verbindung "+e.toString());
                    }
                    //Gilde Ende
                }
                public void getPlaytime(){
                    //Spielzeit Anfang
                    InputStream is1;
                    String result = "";
                    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                    try{
                        HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost("http://tune.finalcut3.com/android/player_search/search_playtime.php?name=" + inputText.getText().toString());
                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                        HttpResponse response = httpclient.execute(httppost);
                        HttpEntity entity = response.getEntity();
                        is1 = entity.getContent();
                        BufferedReader reader = new BufferedReader(new InputStreamReader(is1,"iso-8859-1"),8);
                        StringBuilder sb = new StringBuilder();
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                            sb.append(line);
                        }
                        is1.close();
                        result=sb.toString();
                        playerPlaytimeText.setText("Spielzeit: " + result + " Minuten");
                    }catch(Exception e){
                        Log.e("log_tag", "Fehler bei der http Verbindung "+e.toString());
                    }
                    //Spielzeit Ende
                }
        });
    }

    @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;
    }
}
Wie verpack ich das jetzt in dieses doinbackground und onpostexecute?
 
Zuletzt bearbeitet:
OK, also:
Überall, wo ein Internetzugriff erfolgt, musst du alles in doInBackground auslagern.

Außerdem führe ich jetzt eine klasse namens Spieler.java ein, in dem die Spielerdaten gesammelt werden.

Aufruf der Async Task:
new NamederAsyncTask = newNaederAsyncTask(input.getText().toString());

Also die doInBackground:

Code:
protcted Spieler doInBackground(String spielername){
 //OnlineStatus Anfang
                    InputStream is;
                    String result = "";
                    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
                    try{
                        HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost("http://tune.finalcut3.com/android/player_search/search_player.php?name=" + inputText.getText().toString()); //hier statt inputText.getText().toString() den parameter, der der AsyncTask übergeben wurde, (Variable spielername) einsetzen
                        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                        HttpResponse response = httpclient.execute(httppost);
                        HttpEntity entity = response.getEntity();
                        is = entity.getContent();
                        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                        StringBuilder sb = new StringBuilder();
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                            sb.append(line);
                        }
                        is.close();
                        result=sb.toString();

das ist der Code, mit dem du eben ganz normal deinen Webserver kontaktierst. Du musstest den Parameter Spielername nehmen, da du innerhalb von doInBackground nicht auf UI-Thread Elemente (wie die TextBox) zugreifen darfst.

Weiter mit doInBackground:
Code:
Spieler datenZumSpieler = new Spieler();
 if (result.toString() == "") {
                            datenZumSpieler.setStatus("Kein Spieler gefunden");
datenZumSpieler.setRace("");
//usw.

                        } else {
                           datenZumSpieler.setStatus(result);
datenZumSpieler.setRace(getRace);
//usw
                        }
                    }catch(Exception e){
                        Log.e("log_tag", "Fehler bei der http Verbindung "+e.toString());
                    }
                  
return datenZumSpieler;
}//Ende von doInBackground

So nun machst du noch deine Methoden getRace und so innerhalb der AsyncTask aber nicht in doInBackground!

Dadurch werden sie ja in doInBackground aufgerufen.
Du änderst nur die Rückgabetypen von void zu String und machst das
TextFeld.setTExt(); weg und schreibst return text; -->text ist der Text, den du einsetzen würdest in das Textfeld.

In OnPostExecute:
Code:
protected void onPostExecute(Spieler spieler){
//hier weißt du deinen TextViews deinen Text zu. Dafür benutzt du den Aufruf spieler.getRace(), spieler.getLevel()

In PostExecute darfst du wieder auf die UI zugreifen.

Dann fehlt dir nur noch die Klasse Spieler.java.
Dies kannst du (weiß nicht ob es dir bekannt ist, als eine Art Datensamelklasse sehen. Du machst einfach eine neue Java Class:
Code:
package de.....

public class Spieler{
//du definierst die privaten variablen, die dann die Daten sein sollen
private String status = "";
private String race = "";
//usw...


//Jetzt kommen die Getter und Setter, die wir in der AsyncTask ja immer wieder aufrufen:

public String getStatus() {
         return status;
     }
 public void setStatus(String status) {
         this.status = status;
     }

Und das war es auch schon, du musst das halt nur für alle Variablen machen.

Zum Verständnis. In der doInBackground holst du dir mit
Code:
Spieler datenZumEintragen = new Spieler();
eine neue dieser DAtensammelklasse.
Dann rufst du die set...() Methoden auf und füllst dadurch die Variablen in dieser Klasse.
Diese Datensammlung tust du dann in return zurückgeben und in onPostExecut wird sie dann als Parameter automatisch übergeben.
Dort greifst du über die get...()Methoden auf Variablen der Datensammlung zu.
Damit hast du eine gute Objekt orientierte App :D

Es sind bestimmt nur kleinere Ungenauigkeiten drinne, z.b. musst du in der AsyncTask noch dieses:
Code:
<String, Integer, String
verändern. Mit dem Wissen dass es in folgender Reihenfolge angegeben ist:
<der Asnctask übergebener Wert (spielername), momentaner status (nicht so wichtig), Rückgabewert der doInBackground Methode>

Noch Fragen??

P.S. Der Fehler, warum du keine Rote Exception bei deinen Freunden griegst liegt hieran:
Code:
}catch(Exception e){
                        Log.e("log_tag", "Fehler bei der http Verbindung "+e.toString());
                    }

Wenn du mal im Logcat nach gelben Sachen ausschau hälst (gecatchte Exceptions) wirst du wahrscheinlich eine NetworkOnMainThread Exception sehen.
 
Danke :)
Das hat jetzt zwar denkarbeit gekostet aber es ist sehr verständlich :)

Echt Respekt das du das hier für mich machst :D
Solche Leute wie dich findet man nichtmehr oft :)
 
Ja, hat mich auch gewundert, warum ich das gemacht habe :D
Aber mir ist es am Anfang auch schwer gefallen, aber wenn man es einmal hat, dann hilft es doch ungemein.
Wenn es nicht funktioniert, schreib ne PM, falls es speziel ist, wenn es allgemein ist, schreibs hier ins Forum.
 
Ok kann erst morgen testen..

Aber danke nochmal :)

P. S. Wo ist denn hier der thx Button? :o
Der muss für dich dringend mal gedrückt werden :D
 
Wo muss ich die Klasse mit dem Async Task reinmachen?
Ich kann ja in der player_searchActivity keine neue Klasse einfach reinmachen

und ansonsten kann ich nicht auf die UI Elemente zugreifen wenn ich ne neue Activity Klasse erstelle.

private class GetPlayerData extends AsyncTask<String, Integer, String> {
Also das hier. Wo muss das hin?
 
Doch, mach das vor die schließende Klammer von der player_searchActivity.
Sollte so funktionieren.
Thx Buttons gibts glaub ich erst ab einer gewissen Anzahl an Beiträgen.
 
new GetPlayerData = newNaederAsyncTask(inputText.getText().toString());

Er gibt mir folgenden Fehler aus:
GetPlayerData cannot be resolved to a type

Was mach ich falsch? Hier der Codeschnipsel:

Code:
sendBtn.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
                new GetPlayerData = newNaederAsyncTask(inputText.getText().toString());
            }
        });
        abstract class GetPlayerData extends AsyncTask<String, Integer, String> {
             public Spieler doInBackground(String spielername){
 
versuch mal:
Code:
 NaederAsyncTask GetPlayerData = new NaederAsyncTask(inputText.getText().toString());
 
Code:
new GetPlayerData().execute(inputText.getText().toString());
So gehts

Code:
The type player_searchActivity.GetPlayerData must implement the inherited abstract method AsyncTask<String,Integer,Spieler>.doInBackground(String...)
Das zeigt mir jetzt die Rot unterschlängelte GetPlayerData
Wenn ich die klasse allerdings abstract mache kann ich nichtmehr drauf zugreifen...
 
Zurück
Oben Unten