Android Client: wie funktioniert publishProgress() in AsyncTask ?

  • 8 Antworten
  • Neuester Beitrag
Diskutiere Android Client: wie funktioniert publishProgress() in AsyncTask ? im Android App Entwicklung im Bereich Betriebssysteme & Apps.
M

maksimilian

Ambitioniertes Mitglied
Hallo Ihr,
wie kann ich in einem AsyncTask einen Text auf der GUI ausgeben ? Folgender Code funktioniert nicht.
Code:
 @Override
        protected Void doInBackground(Void... arg0) {

            Socket socket = null;
            DataOutputStream dataOutputStream = null;
            DataInputStream dataInputStream = null;

            try {
                socket = new Socket("192.168.178.32", 50000);
                dataOutputStream = new DataOutputStream(
                        socket.getOutputStream());
                dataInputStream = new DataInputStream(socket.getInputStream());
                dataOutputStream.writeUTF(dstAct);
                response = dataInputStream.readUTF();
                publishProgress( );

            } catch (UnknownHostException e) {
            .......
            .......
        } // doInBackground

       //@Override wird von Android Studio nicht akzeptiert:
       // method does not override or implement a method from a supertype

        protected void onProgressUpdate() {
            textResponse.setText(response);        
        }
Der Versuch, mit dem Aufruf von publishProgres() einen Parameter zu übergeben, scheiterte ebenfalls.

maksimilian
 
Zuletzt bearbeitet:
J

jogimuc

Stammgast
Hallo

Dazu brauchst du das Objekt (Instanz) auf das Widget.

Übergebe es der Klasse entweder im Kostrucktor oder mit einer Setter Methode.
Vor dem Start des AsyncTask .
Auch eine Möglichkeit ist den Context der Activity zu übergeben und sich mit dem Context und findviewbyid das Objekt zu holen.


//@Override wird von Android Studio nicht akzeptiert:
// method does not override or implement a method from a supertype

protected void onProgressUpdate()

Das das Override nicht geht ist klar weil du der Methode gar keinen wert übergibst. Somit überschreibst du keine Methode sondern erstellst einen neue in der Klasse.

Du musst auch den Variablen Typ den du bei der Klasse angegeben Hast verwenden.

Code:
extends AsyncTask< ....., String, ......>

@Override
protected void onProgressUpdate( String... stringParams ) {
Code:
publishProgress("Hallo");
 
Zuletzt bearbeitet:
M

maksimilian

Ambitioniertes Mitglied
Danke, jogimuc, dass Du Dir wieder soviel Mühe mit mir gibst. Ich hoffe, dass Du weiter am Ball bleibst !
Ich versuche mal, etwas genauer meine Situation zu schildern und in der Darstellung des Client-Codes aus Gründen der Übersichtlichkeit mich auf Wesentliches zu beschränken.

Code:
public class MainActivity<firstCall> extends AppCompatActivity {
    TextView textResponse1; // Textfeld mit Id "Response1" auf GUI
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        textResponse1 = (TextView) findViewById(R.id.Response1);   
    }
    
    
    MyClientTask myClientTask = new MyClientTask(act,textResponse1);
    myClientTask.execute();
    
    public class MyClientTask extends AsyncTask<Void, String, Void> {
        String dstAct;
        String response = "";

        MyClientTask(int act,  TextView textResponse1) {
            dstAct = Integer.toString(act);
        }

        @Override
        protected Void doInBackground(Void... arg0) {

            Socket socket = null;
            DataOutputStream dataOutputStream = null;
            DataInputStream dataInputStream = null;Oben
            String s;

            try {
                socket = new Socket("192.168.178.66", 50000);
                dataOutputStream = new DataOutputStream(
                        socket.getOutputStream());
                dataInputStream = new DataInputStream(socket.getInputStream());
                dataOutputStream.writeUTF(dstAct); / der Server wird zu einer Aktion aufgefordert
                response = dataInputStream.readUTF(); // Nachricht vom Server, wird in
                                                      // onPostExecute() ausgegeben
                publishProgress("Hallo" ); // für Test
              } ....
              
        } // doInBackground
        
        // @Override  ???
        protected void onProgressUpdate(String ss){
             textResponse1.setText(ss);
        }
......
    } // class MyClientTask
}
Beim Debuggen stelle ich fest, dass onProgressUpdate() nicht betreten wird. Wie muss ich aus dem GUI Kontext das Textfeld Response1 übergeben, um darin im Hintergrund schreiben zu können ?

Zitat:
"Übergebe es der Klasse entweder im Kostrucktor oder mit einer Setter Methode.
Vor dem Start des AsyncTask .
Auch eine Möglichkeit ist den Context der Activity zu übergeben und sich mit dem Context und findviewbyid das Objekt zu holen."

Könntest Du das bitte anhand meines Codes genauer beschreiben ?
 
swa00

swa00

Moderator
Teammitglied
Randbemerkung - bevor hier an einer Lösung gebastelt wird, die bald eh geändert werden muss

AsynTask ist ab API 30 deprecated und auch in der obigen Form nur in einer Instanz gleichzeitig auszuführen.
(alternativ : System.Thread, Workmanager)
 
Zuletzt bearbeitet:
J

jogimuc

Stammgast
Da du den AsyncTask als innere Klasse machst solltest du auch auf deine textview Klassen Variable zugreifen können. Tust du ja auch.

Wann und ob die Update Methode aufgerufen wird ist nicht garantiert.
Kommt auch darauf wielange der Thread nach den Aufruf noch läuft.

Wie der Parameter in der Update Methode übergeben werden muss habe ich dir ja schon gezeigt.
Dein Oberriede geht so natürlich auch nicht.
 
Zuletzt bearbeitet:
J

jogimuc

Stammgast
Ich glaube du weißt nicht was „…“ bedeutet.

'String… ss' ist dasselbe wie 'String[] ss'
Variable Argumentlisten (Varargs)

Code:
@override
protected void onProgressUpdate(String... ss) {
textResponse1.setText(ss[0]);
}
 
Zuletzt bearbeitet:
J

jogimuc

Stammgast
Hallo @swa00 das AsyncTask ab API 30 debrecadet ist ist mir bekannt.

Aber was meinst du mit "in dieser Form" und nur einer Instanz er ruft es doch auch nur einmal auf. Ja im Klassenrumpf was nicht gehen wird aber das wird wohl seiner Code Kürzung geschuldet sein.
Der Aufruf ist bestimmt in einer Methode.
 
Zuletzt bearbeitet:
M

maksimilian

Ambitioniertes Mitglied
Ich gebe ja zu, dass mir viele Java Syntax (und andere) Basics noch nicht vertraut sind. Wie das so ist, man legt einfach los, praktiziert learning by doing und hofft auf Hilfe aus dem Forum ☺(aber erst nachdem man sich selbst um Lösungen bemüht hat). Ich werde mein Konzept zunächst ändern und auf onProgressUpdate verzichten. In HInblick auf die Tatsache, dass AsyncTask keine Parallelität zulässt, wird ein Wechsel zu Threads sowieso notwendig sein.
 
swa00

swa00

Moderator
Teammitglied
@maksimilian

n HInblick auf die Tatsache, dass AsyncTask keine Parallelität zulässt, wird ein Wechsel zu Threads sowieso notwendig sein.
Das hatte ich nicht geschrieben :) AsyncTask lässt schon eine Parallelität zu , aber nicht mit dem oben angegeben Aufruf der Instanz.

Wenn du schon dich noch ein wenig mehr einliest, würde ich mich im Zuge dessen auch ein wenig mehr mit der OOP
Struktur auseinander setzen und deine Transfer Mimik in einer eigene Klasse unterbringen und eher mit Callback/Listenern arbeiten.
Dann kannst du auch auf Ereignisse besser in der Main reagieren und die UI wunderbar ansprechen.
 
Ähnliche Themen - Android Client: wie funktioniert publishProgress() in AsyncTask ? Antworten Datum
1
9
1