String von AsyncTask ohne Activity an Activity übertragen

  • Antworten:1
Andreas
  • Forum-Beiträge: 1

03.01.2016, 21:25:44 via Website

Hallo liebe AndroidPit Gemeinde,

bin erst seit kurzem an der Android Entwicklung dran und bin nun leider auf ein für mich unlösbares Problem gestoßen.

Zur Problemstellung:

Ich habe eine GUI aus mehreren Activitys und einen AsnyncTask welcher die TCP Verbindungen verarbeitet. Innerhalb meines AsyncTasks empfange ich Strings via TCP Verbindung. Nun möchte ich die empfangenen Strings irgendwie in meine Activitys bekommen. Hab nun schon vergeblich gegoogelt, mit onPost, interface und handler rum probiert aber ich bekomms nicht zum laufen :(

Ich wäre über jede Hilfe sehr dankbar.

AsyncTask:

    public class connectTask extends AsyncTask<String,String,TCPClient>

{
private TCPClient mTcpClient;
public ArrayList arrayList;
// private Context context;
@Override
protected TCPClient doInBackground(String... message)
{
//we create a TCPClient object and
mTcpClient = new TCPClient(new TCPClient.OnMessageReceived()
{
@Override
//here the messageReceived method is implemented
public void messageReceived(String message)
{
//this method calls the onProgressUpdate
publishProgress(message);
}
});
if (TCPHolder.getInstance(mTcpClient) == null)
{
TCPHolder.getInstance(mTcpClient);
}
TCPHolder.getInstance(mTcpClient).getTcp().run();
return null;
}
@Override
protected void onProgressUpdate(String[] values)
{
super.onProgressUpdate(values);
arrayList.add(values[0]);
//Log
Log.i("onProgressUpdate: ", values[0]);
// Wert values soll an Activity übergeben werden.
}
}

und hier meine Activity:

    public class ControlActivity extends AppCompatActivity {
private TCPClient mTcpClient;
private connectTask connectTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_control);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    final SeekBar setgrow = (SeekBar) findViewById(R.id.setgrow);
    final SeekBar sethealth = (SeekBar) findViewById(R.id.sethealth);
    final SeekBar setflow = (SeekBar) findViewById(R.id.setflow);
    String[] values = new String[10];
    new connectTask().execute("");

// Hier muss ich den String aus dem AsyncTask empfangen können...
}

Bin wirklich für jede Hilfe mehr als dankbar

— geändert am 03.01.2016, 21:28:44

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

03.01.2016, 21:38:06 via Website

Hallo Andreas,
herzlich Wilkommen hier im Forum :)

Wenn du das so einbaust, wie du beschreibst, wird der AsyncTask genau auf eine TCPNachricht reagieren.
Sollte dannach noch eine kommen, wird diese ignoriert.
Bzw. auf dem weg den ich hier beschreibe ist das so. Um das zu verhindern, ist nicht viel zu ändern.

Aber ok, nehmen wir mal an das ist absicht:

Zuerst mal muss deine doInBackground Methode einen String zurückgeben.
z.b. so hier:

protected String doInBackground(Object... params) //Das Objekt Array brauchst d nicht beachten, benutzt du hier nicht. Habe es nur weben der namensgebung umbenannt.

Als nächstes muss dein TCPClient auch den String zurückgeben, wenn er ihn empfangen hat.

public void messageReceived(String message)
{
//this method calls the onProgressUpdate
return message;
}

protected void onPostExecute(Stringresult) {

    // Task abgeschlossen, Ergebnis kann verwendet werden

//Hier musst du dann ein Callback (Interface)
implementieren.
}

Für den Callback und Interface kannst du mal hier schauen:
http://stackoverflow.com/a/18054783

Falls immer Aachrichten ankommen sollen, machst du das mit dem Callback in publishProcess und lässt den Callback da ausführen.

Aber, die TCPClient klasse hat doch schon callbacks, macht diese das holen der Daten nicht schon im eigenen Thread?

Wozu dann der asyncTask?

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

Antworten