in onQueryTextSubmit, Rückgabewerten einer Methode in eine Variable speichern

  • 2 Antworten
  • Letztes Antwortdatum
A

AndroidFanat

Neues Mitglied
0
Hallo, ich habe gerade ein Problem in einer Activity in der Methode onQueryTextSubmit von einer Methode aus einer anderen Klasse einen Rückgabewert in eine Variable zu speichern und mit Log auszugeben, da eine Fehlermeldung kommt und die App stürzst ab. Deswegen würde ich mich über jeden Tipp freuen.

Fehlermeldung:
Code:
InputEventSender    
Exception dispatching finished signal.
MessageQueue-JNI  
Exception in MessageQueue callback: handleReceiveCallback
MessageQueue-JNI
java.lang.NullPointerException
MessageQueue-JNI
....MainActivity.onQueryTextSubmit(MainActivity.java:124)
........
........
Methode:

Code:
 @Override
  public boolean onQueryTextSubmit(final String query)
  {

    String isbn = "isbn";

    CallClient callClient = new CallClient("http://ip/serverName/webServlet");

    String splaten[] = { isbn };
    String zellen[] = { query };
    Table t = new Table(splaten);

    t.addRowValues(zellen);
    Table antwort = callClient.doCall("Test", t);
    Log.d("Antwort", antwort.getColumnName(1));
   
    return true;
  }
Es ist so ohne die letzten Zeilen funktioniert alles wunderbar doCall Methode, nur bei diese letzten Zeilen:
Table antwort = callClient.doCall("Test", t);
Log.d("Antwort", antwort.getColumnName(1));

hackt es :confused2:

doCall Methode

Code:
 public Table doCall(String handlerName, final Table parameter)
  {
    final CSVConverter csvConverter = new CSVConverter();
    final String parameterString = csvConverter.tableToString(parameter);
    new Thread(new Runnable()
    {
      public void run()
      {
        try
        {

          URLConnection connection = url.openConnection();
          connection.setDoOutput(true);
          OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
          out.write(parameterString);
          out.close();

          BufferedReader in = new BufferedReader(new InputStreamReader(connection
              .getInputStream()));

          String returnString = "";

          while ((returnString = in.readLine()) != null)
          {
            daten = returnString;

          }
          in.close();
          Log.d("Buchdaten", daten);
          antwort = csvConverter.stringToTable(daten);
          Log.d("Spaltenname Nr.2 ", antwort.getColumnName(1));

        }
        catch (Exception e)
        {
          Log.d("Exception", e.toString());
        }

      }
    }).start();
    return antwort;
  }
hier am ende der Methode wird Log ganz normal ausgegeben also kann das nicht an der Methode liegen :confused2:

Der Rückgabewert der Methode ist null aber ich verstehe nicht ganz wieso, in der doCall Methode fast ganz am Ende ist die noch nicht null da Log Ausgabe ohne Probleme statfindet. Kann es sein, dass es mit dem Thread zusammenhängt und ich diesen erstmal beenden sollte?

Gruß
 
Zuletzt bearbeitet:
Genau, Du kannst Dich nicht darauf verlassen, dass "return antwort;" erst erreicht wird, nachdem Dein Thread beendet ist. Bzw. ist das sogar so gut wie ausgeschlossen. Du startest den Thread, der irgendwann mal abgearbeitet wird und schon in der nächsten Zeile returnst Du den Wert, der erst im Thread ermittelt wird - wie gesagt: irgendwann.

Schau Dir statt "Thread" mal lieber "AsyncTask" an: Eigene Klasse ableiten und die beiden Funktionen "doInBackground" (für die Arbeit, die zu tun ist) und "onPostExecute" (zum Zurückgeben des gewünschten Wertes) überschreiben.
 
Okay, danke für die Antwort!
 
Zurück
Oben Unten