Problem mit AsyncTask

  • 2 Antworten
  • Neuester Beitrag
Diskutiere Problem mit AsyncTask im Android Allgemein im Bereich Betriebssysteme & Apps.
M

maksimilian

Ambitioniertes Mitglied
Hallo Ihr,

mein einfacher TCP-Client sieht (auf's Wesentliche reduziert) wie folgt aus:
Code:
public class MainActivity<firstCall> extends AppCompatActivity {
    .....
    .....
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        Button1 = (Button) findViewById(R.id.GUIButton1);
        Button1.setOnClickListener(Button1_OnClickListener);
    }

    OnClickListener Button1_OnClickListener = new OnClickListener() {   
        @Override
        public void onClick(View v) {   
               MyClientTask myClientTask = new MyClientTask(1);
               myClientTask.execute();
      }
   
    public class MyClientTask extends AsyncTask<Void, Void, 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
              } ....
             
        } // doInBackground
       
        @Override
        protected void onPreExecute() {.....}
       
        @Override
        protected void onPostExecute() {.....}
       
    } // class MyClientTask
}
Der Client hat bisher die Button-Clicks korrekt verarbeitet. Wie das so ist, tut er es nach einigen Änderungen am Code nicht mehr korrekt. Das äußert sich darin, dass nach einigen Button-Clicks, die korrekt verarbeitet werden, der myClientTask.execute() laut Debugger des Android Studios nicht mehr zum Betreten des MyClientTask-Codes führt, sondern nur im public final AsyncTask der übergeordneten Klasse (SyncTask.java) landet, von wo er sofort zurückkehrt hinter den execute Aufruf in MainActivity.

Code:
@MainThread
    public final AsyncTask<Params, Progress, Result> execute(Params... params) {
        return executeOnExecutor(sDefaultExecutor, params);
    }
Es ist zuviel verlangt, mit diesen Angaben den Fehler zu finden. Mich würde aber interessieren, wie ich mit dem Debugger arbeiten muss, um die Ursache des Fehlverhaltens herauszufinden.

maksimilian
 
M

maksimilian

Ambitioniertes Mitglied
Ich habe mal den Default-Executor ersetzt durch
Code:
myClientTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
Danach funktioniert der Client im Simulationsbetrieb (Nexus 4) eine Weile, dh. Buttons werden laufend betätigt, dann stürzt er irgendwann ab. Wenn der Client auf einem Samsung SM-A310F läuft, stürzt er früher ab. Wie kann ich die Absturzursache mit dem Debugger des Android Studios herausfinden ?

Kann es sein, dass AsyncTask nicht ordnungsgemäß beendet und mehrfach läuft, so dass irgendwann der Arbeitsspeicher überläuft und somit ein Absturz verursacht ?
 
M

maksimilian

Ambitioniertes Mitglied
Mühseliges Lernen ! Meine Vermutung war schon richtig, aber die Ursache dafür habe ich erst jetzt gefunden. In einer bestimmten Situation wurde keine Nachricht vom Server geschickt, so dass der Client im dataInputStream.readUTF() hängen blieb. Folgende Button Clicks führten zwar zur Instanzierung weiterer AsyncTasks aber nicht zum Aufruf der doInBackground Methode.